Android開發時,由於要實現某某功能,須要集成算法公司的算法庫(so庫),這就須要本身編寫JNI。java
一般這些庫提供的接口能夠概況成一、初始化 二、算法處理 三、釋放 四、打印版本號算法
初始化後會返回一個指針(句柄),算法處理和釋放時都會用到這個指針,因此在初始化後,須要將這個指針返回到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; }
可是若是算法返回的是智能指針,且裏面保存的是一個類的指針,則須要改爲:code
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; }