2015-10-12 29 views
0

我有一個靜態的方法叫做getCurrValue()JNI CallStaticLongMethod總是返回0L

package com.my; 
public class MyClass { 
    public static long value = 5L; 
    public static long getCurrValue(){ 
     return value; 
    } 
} 

一個Java類和我在本地C/C++代碼的方法稱爲useValue(JNIEnv* env)。 當我嘗試使用Java靜態方法getCurrValue()獲取本機c/C++代碼中的value時,我始終得到0L作爲結果 - 爲什麼?

void useValue(JNIEnv* env) { 
    jclass clazz = env->FindClass("com/my/MyClass"); 
    jlong result = -1L; 
    jmethodID get_curr_value_method_id = env->GetStaticMethodID(clazz,"getCurrValue","()J"); 
    result = env->CallStaticLongMethod(clazz,get_curr_value_method_id); 
    // the result is 0L 
} 
+1

您是否在通話後檢查異常? – EJP

+0

@ EJP其實,我沒有發現任何異常。 – zh18

+0

你檢查過嗎? – EJP

回答

1

我測試了這個代碼的本地方法和我的Nexus 9與Android 6.0,它的工作完美。

jstring Java_it_stefanocappa_ndkexample_Example_stringFromJNI(JNIEnv* env, jobject thiz) {  
    jclass clazz = (*env)->GetObjectClass(env, thiz);   
    jmethodID staticMethodId1; 
    staticMethodId1 = (*env)->GetStaticMethodID(env, clazz, "getCurrValue", "()J"); 
    jlong staticMethodResult2; 
    staticMethodResult2 = (jlong) (*env)->CallStaticLongMethod(env, clazz, staticMethodId1); 
    return (*env)->NewStringUTF(env, "Hello from JNI); 
} 

如果你不滿意我的回答,請寫出來,我會後整個完全正常的工作實例;)


更新的建議:

我更新項目在幾個月前我意識到的Github上。

庫:https://github.com/Ks89/NdkExample_AndroidStudio

看 「example.c」 線155-166。

顯然,在這個例子中還有其他功能。

+0

我的錯誤是,當我測試返回值時,我使用格式「%ld」,但是jlong​​是一個很長的類型,當我將格式更改爲「%lld」時,其它的都沒問題。如果你可以發佈完整的實例。它可以幫助更多人認爲,謝謝。 – zh18

+0

如果有任何Java語言方法拋出異常的機會,本機代碼在繼續之前需要檢查異常。如果拋出異常,返回值是未定義的,事情可能會在以後出現異常。準備用作正確示例的代碼應特別勤奮。另見http://developer.android.com/training/articles/perf-jni.html#exceptions – fadden

+0

謝謝你的建議。當我有空時,我會更新這個例子。 –