4.3. ハローワールド (JNI) の続き

まず javah 等で自動生成したヘッダーファイルとなります。

com_book_jni_HelloJNI.h. 

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_book_jni_HelloJNI */

#ifndef _Included_com_book_jni_HelloJNI
#define _Included_com_book_jni_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_book_jni_HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_book_jni_HelloJNI_sayHello
  (JNIEnv *, jobject);

/*
 * Class:     com_book_jni_HelloJNI
 * Method:    checkDevice
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_book_jni_HelloJNI_checkDevice
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

次にヘッダーファイルを実装します。

実装には OpenCL の C 言語の API を使うため、C 言語での OpenCL アプリケーションの実装の知識が必要となります。

本書では C 言語での説明は割愛しますので、興味があるなら拙著の C 言語バージョンを参照ください。

com_book_jni_HelloJNI.c. 

#include <jni.h>
#include <stdio.h>
#include "com_book_jni_HelloJNI.h"
#include <OpenCL/cl.h>

JNIEXPORT void JNICALL Java_com_book_jni_HelloJNI_checkDevice(
        JNIEnv *env, jobject thisObj) {

        cl_platform_id platform;
        cl_device_id *devices;
        cl_uint num_devices, addr_data;
        cl_int i, err;
        char name_data[48], ext_data[4096];
        err = clGetPlatformIDs(1,
                        &platform, NULL);
        if(err < 0) {
          perror("failed to find platforms");
          exit(1);
        }
        err = clGetDeviceIDs(platform,
                        CL_DEVICE_TYPE_ALL,
                        1, NULL, &num_devices);
        if(err < 0) {
          perror("Failed to find devices");
          exit(1);
        }
        devices = (cl_device_id*)
                 malloc(sizeof(cl_device_id) * num_devices);
        clGetDeviceIDs(platform,
                        CL_DEVICE_TYPE_ALL,
                        num_devices,
                        devices, NULL);

        for(i=0; i<num_devices; i++) {
          err = clGetDeviceInfo(devices[i],
                          CL_DEVICE_NAME,
                        sizeof(name_data), name_data, NULL);
          if(err < 0) {
                  perror("Failed to read device name");
                  exit(1);
          }
          printf("CL_DEVICE_NAME: %s\n",name_data);
          clReleaseDevice(devices[i]);
        }

        free(devices);
}

Java_com_book_jni_HelloJNI_checkDevice() 関数は OpenCL が使えるデバイスのクエリーをして、見つかったデバイスを標準出力します。

Copyright 2018-2019, by Masaki Komatsu