在Android JNI调用中从静态方法访问非静态方法

时间:2019-07-02 12:50:08

标签: java android java-native-interface

如何从Java / Kotlin的静态方法访问C ++方法。

当我尝试访问它时。我收到此错误。

  

“不能从静态引用非静态'stringFromJNI()'   上下文”

JNIHelper.kt:

对象JNIHelper {

external fun stringFromJNI(): String

init {
    System.loadLibrary("native-lib")
}

}

native-lib.cpp:

extern "C" JNIEXPORT jstring JNICALL
Java_com_my_package_JNIHelper_stringFromJNI( //Test
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

Sample.Java:

private static Data getData(Context context) {
     return JNIHelper.stringFromJNI(); //Here i get Compilation error
}

1 个答案:

答案 0 :(得分:-1)

与Java中的操作相同:您必须传递对象,然后获取其类,执行“ env-> getDeclaredMethod(object_class,“ method_name”, params )”以获取非静态方法,然后调用它。

在您的情况下,您必须这样做..:

JNIHelper().stringFromJNI()

..因为该方法属于应该实例化的类,或者您必须将“ stringFromJNI()”声明为静态,所以实际上在我的项目中我声明了类似JNI的方法

public native static void methodName();

,仅通过使用Class而不是其Instance即可在任何地方使用它们。