JNI 資料型態與傳送
資料型態對應
Java JNI 的資料,是位於JVM之內,而C/C++的資料則位於JVM之外。Java傳到C/C++,必需有相互對應的型態。
基本資料型態
Java的 8 個基本資料型態
byte, short, int, long, float, double, char, boolean
分別對應到 C/C++的
jbyte, jshort, jint, jlong, jfloat, jdouble, jchar, jboolean
陣列
Java的 byte[], short[]…分別對應到C/C++的jbyteArray, jshortArray…..
其他
另外還有Java的object, Class, String, Throwable對應到jobject, jclass, jstring, jthrowable
詳細列表如下
Java | C/C++ | 備註 |
byte | jbyte | |
short | jshort | |
int | jint | |
long | jlong | |
float | jfloat | |
double | jdouble | |
char | jchar | |
boolean | jboolean | |
byte[] | jbyteArray | |
short[] | jshortArray | |
int[] | jintArray | |
long[] | jlongArray | |
float[] | jfloatArray | |
double[] | jdoubleArray | |
char[] | jcharArray | |
boolean[] | jbooleanArray | |
Object[] | jobjectArray | |
all Object | jobject | |
Class | jclass | |
String | jstring | |
Throwable | jthrowable |
C/C++原本沒有 jbyte, jshort, ……這些型態的,怎麼會無端生出這些呢? 因為這些新型態在 jni.h標頭檔中重新被定義過了,所以一定要include
函數名稱對應
Java JNI
Java Jni中必需在companion object的init{}中先載入函數庫,然後再宣告外部函數名稱。外部函數的修飾子在Kotlin是 external, 在Java是使用native,如下所示
