2016-10-09 6 views
1

Я использую следующий код для упаковки всех встроенные функцийандроид отчет JNI не может найти метод

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; 
} 

и я называю обертку класс от моей основной деятельности, которая является

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) 

Может кто-нибудь мне помочь?

+1

Не раздумывайте о подписи метода JNI, или попытаться сделать их самостоятельно. Используйте вывод 'javap -s'. Это не так, – EJP

+1

Boolean - это не то же самое, что и boolean – samgak

+0

@EJP. Вы были правы, но теперь я изменил тип с ** Boolean ** на ** boolean ** и проверил его с помощью javap -s и подпись есть '() Z', и ошибка остается той же – quetzalfir

ответ

1

Использование GetStaticMethodId для статической функции:

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

в данный момент, я лично сталкиваюсь, Я никогда не думал, что такая функция существует, вам очень благодарна – quetzalfir

 Смежные вопросы

  • Нет связанных вопросов^_^