JNI 全称是 Java Native Interface。是在 Java 和 Native 层(包罗但不限于C/C++)彼此挪用的接口类型。
JNI 在 Java 1.1中正式推出,在 Java 1.2版本中插手了 JNI_OnLoad、JNI_OnUnload 要领,这两个要领照旧很有用的,后头再说。
JNI基本篇
Java 通过 JNI 挪用当处所法的进程大抵是:
native
要害字修饰。 好比 private static native int native_newInstance();
javah
呼吁生成 Java 类对应的 C/C++ 头文件。javah -encoding utf-8 -cp src com.young.soundtouch.SoundTouch;
个中第3步在 Java 1.2 中增加了 JNI_OnLoad
要领之后有另一种实现方法(后头说)。
javah 生成的头文件大抵是这样的:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_young_soundtouch_SoundTouch */ #ifndef _Included_com_young_soundtouch_SoundTouch #define _Included_com_young_soundtouch_SoundTouch #ifdef __cplusplus extern "C" { #endif #undef com_young_soundtouch_SoundTouch_SETTING_USE_AA_FILTER #define com_young_soundtouch_SoundTouch_SETTING_USE_AA_FILTER 0L /* * Class: com_young_soundtouch_SoundTouch * Method: native_getDefaultSampleElementSize * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_young_soundtouch_SoundTouch_native_1getDefaultSampleElementSize (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
文件开头就是普通的头文件,可是可以发明:
下面在 C/C++ 中实现这个要领就行啦。可是在动手前现大抵相识以下 jni.h 拟定的游戏法则。
javah 生成的头文件内里利用的范例都是 jni.h 界说的,目标是做到平台无关,好比担保在所有平台上 jint 都是32位的有标记整型。
根基对应干系如下:
劳务调派打点系统 programmer wishes to invoke.” CalltypeMethodA(jobject obj" class="size-full wp-image-30095 aligncenter" title="Snipaste_2018-10-08_07-59-01" src="/uploads/allimg/c181009/153Z2910S0B0-160I.png" />
引用范例对应干系:
劳务调派打点系统 programmer wishes to invoke.” CalltypeMethodA(jobject obj" class="aligncenter size-full wp-image-30096" title="Snipaste_2018-10-08_08-00-15" src="/uploads/allimg/c181009/153Z2910S4W0-210R.png" />
通过表格发明,除了上面界说的 String
、Class、
Throwable
,其他的类(除了数组)都是以 jobject
的形式呈现的!事实上 jstring、 jclass 也都是 object 的子类。所以这里照旧和 Java 层一样,一切皆 jobject。(虽然,假如 jni 在 C 语言中编译的话是没有担任的观念的,此时 jstring、jclass 等其实就是 jobject!用了 typedef 转换罢了!!)
接下来是 JNIEnv *
这个指针,昆山软件开发,它提供了 JNI 中的一系列操纵的接口函数。