JNI Java層類關聯C/C++層的類
阿新 • • 發佈:2018-12-10
Android開發時,因為要實現某某功能,需要整合演算法公司的演算法庫(so庫),這就需要自己編寫JNI。
通常這些庫提供的介面可以概況成1、初始化 2、演算法處理 3、釋放 4、列印版本號
初始化後會返回一個指標(控制代碼),演算法處理和釋放時都會用到這個指標,所以在初始化後,需要將這個指標返回到Java層儲存起來。
public static native long init(); public static native boolean deal(long handle); public static native boolean release(long handle);
JNIEXPORT jlong JNICALL Java_com_test_Test_init (JNIEnv *, jobject) { void* handle = xxxInit(); return (jlong)handle; } JNIEXPORT jboolean JNICALL Java_com_test_Test_deal (JNIEnv *, jobject, jlong jhandle) { void* handle = (void*)jhandle; xxxDeal(handle); return true; } JNIEXPORT jboolean JNICALL Java_com_test_Test_release (JNIEnv *, jobject, jlong jhandle) { void* handle = (void*)jhandle; xxxRelease(handle); return true; }
但是如果演算法返回的是智慧指標,且裡面儲存的是一個類的指標,則需要改成:
JNIEXPORT jlong JNICALL Java_com_test_Test_init (JNIEnv *, jobject) { auto handle = xxxInit(); return (jlong)handle.release(); } JNIEXPORT jboolean JNICALL Java_com_test_Test_deal (JNIEnv *, jobject, jlong jhandle) { xxx* handle = (xxx*)jhandle; handle->Deal(); return true; } JNIEXPORT jboolean JNICALL Java_com_test_Test_release (JNIEnv *, jobject, jlong jhandle) { void* handle = (void*)jhandle; delete handle; return true; }