jni CallStaticLongMethod总是返回0L

时间:2015-10-12 07:50:14

标签: java android android-ndk java-native-interface

我在Java类中有一个名为getCurrValue()

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

我在本地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 个答案:

答案 0 :(得分:1)

我使用原生方法和使用Android 6.0的Nexus 9测试了此代码,并且它运行良好。

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

Look" example.c"第155-166行。

显然,在这个例子中还有其他功能。