2015-01-13 122 views
1

Java代碼是否有可能JNI函數返回整數或布爾值?

boolean b = invokeNativeFunction(); 
int i = invokeNativeFunction2(); 

C代碼

jboolean Java_com_any_dom_Eservice_invokeNativeFunction(JNIEnv* env, jobject obj) { 
    bool bb = 0; 
    ... 
    return // how can return 'bb' at the end of the function? 
} 

jint Java_com_any_dom_Eservice_invokeNativeFunction2(JNIEnv* env, jobject obj) { 
    int rr = 0; 
    ... 
    return // how can return 'rr' at the end of the function? 
} 

是否有可能JNI函數返回整數或布爾?如果是的話,我該怎麼做?

回答

4

是的,就直接返回值。

JNIEXPORT jint JNICALL Java_com_example_demojni_Sample_intMethod(JNIEnv* env, jobject obj, 
    jint value) { 
    return value * value; 
} 

JNIEXPORT jboolean JNICALL Java_com_example_demojni_Sample_booleanMethod(JNIEnv* env, 
    jobject obj, jboolean unsignedChar) { 
    return !unsignedChar; 
} 

有Java原始類型和天然型,參考here之間的映射關係。

0

我覺得你的方法簽名可能是錯的...

https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

如果你會發現幾件事情:

1)增設JNIEXPORTJNICALL各地方法.. 2)要返回的參數類型爲j<object>

我認爲你需要mofidy你INT例子:

JNIEXPORT jint JNICALL Java_com_any_dom_Eservice_invokeNativeFunction2(JNIEnv* env, jobject obj) { 
    jint rr = 99; 
    ... 
    return rr; 
} 
0

爲什麼不只是做一些靜態蒙上:

return static_cast<jboolean>(bb); 

return static_cast<jint>(rr); 

在我的jni.hjint副本被定義爲int32_t,和jboolean被定義爲uint8_t。在C++和Java(在VM級)AFAIK(即0 == false,1 == true),truefalse的內部表示相同。

你當然也可以添加一些健全檢查,如果你想,例如:

assert(numeric_limits<jint>::is_signed == numeric_limits<decltype(rr)>::is_signed && 
     numeric_limits<jint>::min() <= numeric_limits<decltype(rr)>::min() && 
     numeric_limits<jint>::max() >= numeric_limits<decltype(rr)>::max()); 
相關問題