JNI個人筆記1

JNI方法記錄

java聲明lib.so


static{
	System.loadLibrary("lib");
}

c++ 字符串 轉 Java 字符串
env->NewStringUTF(“xxxx”);

javah -classpath (class路徑)

JNIEXPORT jstring JNICALL Java_com_example_hellojni_stringFromJNI(JNIEnv *,jobject);

JNIEnv是指向可用JNI函數表的接口指針, jobject是HelloJni類實力的Java對象引用

原生代碼可通過JNIEnv 調用Java方法

Java類型 | 原生類型

java.lang.Class -> jclass
java.lang.Throwable -> jthrowable
java.lang.String -> jstring
Other objects -> jobjects
java.lang.Object[] -> jobjectArray
boolean[] -> jbooleanArray
byte[] -> jbyteArray
char[] -> jcharArray
short[] -> jshortArray
int[] -> jintArray
long[] -> jlongArray
float[] -> jfloatArray
double[] -> jdoubleArray

字符串操作

創建字符串

jstring javaString;
javaString = env->NewStringUTF(“xxx”);

將 Java 字符串轉換成 C字符串

const jbyte* str;
jboolean isCopy;

str = env->GetStringUTFChars(javaString, &isCopy);

釋放字符串

JNI GetStringChars 函數 和 GetStringUTFChars 獲得的C字符串在原生代碼中使用完需要釋放

env->ReleaseStringUTFChars(javaString, str);

數組操作

1.創建數組

jintArray javaArray;
javaArray = env->NewIntArray(10);
if(0 != javaArray) {
	
}

2.訪問數組元素

2.1 將java數組轉換爲c數組

對副本的操作

jint nativeArray[10];
env->GetIntArrayRegion(javaArray,0,10,nativeArray);

再通過 env->SetArrayRegion(javaArray, 0, 10, nativeArray);

2.2 通過JNI提供直接指向數組元素的指針

對直接指針的操作

jint* nativeDirectArray;
jboolean isCopy;

獲取
Get<Type>ArrayElements;

nativeDirectArray = env->GetIntArrayElements(javaArray, &isCopy);
釋放
Release<Type>ArrayElements;

釋放模式

0 -> 將內容複製回來並釋放原生數組
JNI_COMMIT -> 將內容複製回來但是不釋放原生數組
JNI_ABORT -> 釋放原生數組但不用將內容複製回來

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章