android JNI报告找不到方法

标签 android java-native-interface nosuchmethoderror jnienv

我使用以下代码来包装所有 native 函数

package com.user.game;

import android.content.res.AssetManager;

public class MyGLRenderer {

    static {
        System.loadLibrary("Engine");
    }

    public static native void passAssetManager(AssetManager assetManager);
    public static native void getAppDirectory(String dir);
    public static native void setExternalDirectory(String dir);
    public static native void pointerLeave(int id, float x, float y);

}

我使用 C++ 中的以下内容

JavaVM* javaVM = NULL;

jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    javaVM = vm;
    return JNI_VERSION_1_6;
}

bool call_Java_checkStoragePermission() {
    JNIEnv *env;
    bool shouldDetach = false;
    static jclass javaClassRef = NULL;
    static jmethodID javaMethodRef = NULL;
    static bool once = true;

    if (javaVM->GetEnv((void **)&env, JNI_VERSION_1_6) == JNI_EDETACHED) {
        shouldDetach = true;
        javaVM->AttachCurrentThread(&env, NULL);
    }

    if (once) {
        jclass dataClass = javaClassRef = env->FindClass("com/quetzalfir/polygondash/Game_Activity");
        if (checkExcp(env, "findclass")) {
            return false;
        }

        javaClassRef = (jclass) env->NewGlobalRef(dataClass);
        if (checkExcp(env, "newGlobalRef")) {
            return false;
        }

        //BEFORE EDIT: this was env->GetMethodID();
        javaMethodRef = env->GetStaticMethodID(javaClassRef, "checkStoragePermission", "()Z");
        if (checkExcp(env, "get methodID")) {
            return false;
        }

        once = false;
    }

    jboolean ans = env->CallStaticBooleanMethod(javaClassRef, javaMethodRef);

    if (shouldDetach) {
        javaVM->DetachCurrentThread();
    }

    return ans;
}

bool checkExcp(JNIEnv *env, const char *str) {
    if (env->ExceptionCheck()) {
        SFLOGI("JNI: error %s",str);
        jthrowable flag = env->ExceptionOccurred();
        env->ExceptionClear();
        env->Throw(flag);

        return true;
    }

    return false;
}

我从我的主要 Activity 中调用包装类

package com.user.game;

public class Game_Activity extends Activity {
    private static String TAG = "Debugging";

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        MyGLRenderer.getAppDirectory(getExternalFilesDir(null).getAbsolutePath());
        MyGLRenderer.setExternalDirectory(Environment.getExternalStorageDirectory().getPath());

        MyGLRenderer.passAssetManager(getAssets());
    }

    public static boolean checkStoragePermission() { //before edit Boolean

        Log.w(TAG, "calling...........");

        return true;
    }

}

但是当我调用call_Java_checkStoragePermission()时,我收到以下错误

10-09 16:34:48.502 18590-18590/com.user.game D/dalvikvm: GetMethodID: not returning static method Lcom/user/game/Game_Activity;.checkStoragePermission ()Z
10-09 01:15:17.081 14171-14171/com.user.game I/Debugging: JNI: error get methodID
10-09 01:15:17.081 14171-14171/com.user.game I/Debugging: bool = 0
10-09 01:15:17.081 14171-14171/com.user.game E/InputEventReceiver: Exception dispatching input event.
10-09 01:15:17.081 14171-14171/com.user.game E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
10-09 01:15:17.091 14171-14171/com.user.game E/MessageQueue-JNI: java.lang.NoSuchMethodError: no method with name='checkStoragePermission' signature='()Z' in class Lcom/user/game/Game_Activity;
                                                                                  at com.user.game.MyGLRenderer.pointerLeave(Native Method)

有人可以帮助我吗?

最佳答案

使用GetStaticMethodId对于静态函数:

jmethodID javaMethodRef = env->GetStaticMethodID(javaClassRef, "checkStoragePermission", "()Z");

关于android JNI报告找不到方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940871/

相关文章:

android - 在 Android 应用程序中使用 NDK 构建的库时如何捕获 UnsatifiedLinkError?

java - 在 Android 上从另一个 xml 文件中的 DatePicker 获取日期

Android——几乎完全在 OpenGL 中制作用户界面有什么问题吗?

java - 通过 JNI 在 Android 上从 C++ 调用 Java 函数

java - jstring/c++ 的 Ljava/lang/String 错误

java - 如果带有 getConstructor() 的内部类如何创建实例

Android:在自定义 View 上膨胀异常

java - Activity 已泄漏 IntentReceiver - LollipopBrowserAccessibilityManager

Android - 从图库加载图像并设置为背景

android - 不存在这样的方法