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