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; }