JNI Java層類關聯C/C++層的類

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;
}
相關文章
相關標籤/搜索