iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
JNI (Java Native Interface) は、Java仮想マシン (JVM) で実行されるJavaコードと、C言語などのネイティブ・プログラミング言語のコードを相互運用できるようにするためのインタフェースです。
ざっくりと説明すると、以下のことができるようになります。
AndroidでCやC++のコードを使えるようにするツールセットです。
現在デフォルトのビルドツールはCMakeで、以前は、ndk-buildでした。古い資料はndk-buildを想定した説明になっていますので、CMakeに読み替えることになります。
以下のC言語の関数が、demoライブラリモジュールに用意されているものとします。
JNIEXPORT void JNICALL Java_com_example_Demo_printString(JNIEnv *env, jobject obj, jstring javaString)
{
const char *nativeString = (*env)->GetStringUTFChars(env, javaString, NULL);
printf("%s\n", nativeString);
(*env)->ReleaseStringUTFChars(env, javaString, nativeString);
}
以下のJavaコードから呼び出します。
package com.example;
public class Demo {
static {
System.loadLibrary("demo");
}
public static native printString(String s);
public static void main(String[] args) {
printString("hello, world");
}
public static void dump() {
System.out.println("hello, world");
}
}
C言語の関数が、JavaのクラスDemoのメソッドとして扱われています。
JNIEnvへのポインタを取得する。
JavaVM *g_vm;
JNIEnv *env = NULL;
g_vm->AttachCurrentThread((void **)&env, NULL);
Javaコードを呼び出す。
jclass jcDemo = env->FindClass("com/example/Demo");
jfieldID jfDemoDump = env->GetStaticFieldID(jcDemo, "dump", "(V)V");
env->CallStaticVoidMethod(jcDemo, jfDemoDump);
env->DeleteLocalRef(jcDemo);
デタッチする。
g_vm->DetachCurrentThread();