1. 程式人生 > >JNI Java層類關聯C/C++層的類

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

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