2016-08-09 4 views
4

ich die folgende Störung erhalte:JNI erkannter Fehler in der Anwendung: JNI mit anhängiger Ausnahme java.lang.ClassNotFoundException genannt GetMethodID: Haben Sie nicht gefunden Klasse

JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.ClassNotFoundException: Didn't find class "package.name.class" on path: DexPathList[[zip file "/system/framework/sample.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.ClassNotFoundException: Didn't find class "package.name.class" on path: DexPathList[[zip file "/system/framework/XposedBridge.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 
26771-26918/package.name.class A/art: art/runtime/java_vm_ext.cc:410] at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56) 
26771-26918/package.name.class A/art: art/runtime/java_vm_ext.cc:410] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:511) 
26771-26918/package.name.class A/art: art/runtime/java_vm_ext.cc:410] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:469) 

hier mehr über den Fehler ist:

`jmethodID MethodId; 
    JNIEnv * env; 
    int nStatus = gVM->GetEnv((void**)&env, JNI_VERSION_1_6); 
    int nResult = attachStatus(nStatus, &env); 
    LOG_HM("::attach status = %d::\n", nResult); 
    if (nResult == ATTACH_FAILED) { 
     LOG_HM("Attach failed"); 
     return ; 
    } 

jclass classClass = env->GetObjectClass(gTotalUsageClass); 
    auto classLoaderClass = env->FindClass("java/lang/ClassLoader"); 
    auto getClassLoaderMethod = env->GetMethodID(classClass, "getClassLoader", 
              "()Ljava/lang/ClassLoader;"); 
    gClassLoader = env->CallObjectMethod(gTotalUsageClass, getClassLoaderMethod); 
    gFindClassMethod = env->GetMethodID(classLoaderClass, "findClass", 
            "(Ljava/lang/String;)Ljava/lang/Class;"); 

    jclass totalUsage = static_cast<jclass>(env->CallObjectMethod(gClassLoader, gFindClassMethod, env->NewStringUTF("com/a/a/TotalUsageInfo"))); 

    TotalUsageInfo *info = NULL; 
    jobject jUsageInfo = NULL; 

     jlong noOfProc = 0; 
     jlong memTotal = 0; 
     jlong memFree = 0; 
     jlong cache = 0; 
     jlong buffer = 0; 
     jlong cpuUtil = 0; 
     //jclass totalUsage = env->FindClass("com/a/a/TotalUsageInfo"); 
     if (totalUsage == NULL) { 
      LOG_HM("Class TotalUsageInfo not Found \n"); 
      nResult = FAIL; 
      detachThread(nResult); 
      return; 
     } 
     else { 
      LOG_HM("Class TotalUsageInfo Found \n"); 
     } 

     jmethodID constructor = env->GetMethodID(totalUsage, "<init>", "(JJJJJJ)V"); 
     if (NULL == constructor) { 
      LOG_HM("JNIGetTotalUsageInfo::TotalUsageInfo constructor not found\n"); 
      nResult = FAIL; 
      detachThread(nResult); 
      return ; 
     }` 
+0

Dies ist das Crashprotokoll. Ich versuche, einen Rückruf von einem nativen C++ - Thread an das Java-Modul zu senden. Ich habe an den Haupt-Thread angehängt, indem ich attachCurrenThread aufgerufen habe, aber diesen Absturz immer noch erhalte, wenn ich die GetMethodID-Funktion vom nativen Thread aufruft. Die an GetMEthodID übergebene jclass ist nicht null. – andy

+1

würde es wirklich helfen, wenn Sie die genaue Linie zur Verfügung stellen können, die bricht, sehen einige Sachen hier fischig aus. Ich nehme an, dein Problem ist mit der Methode exakte Signatur. aber nicht 100% sicher. Es würde helfen, wenn Sie einen genaueren Bruchpunkt zur Verfügung stellen. – Tancho

+0

Ihre native Bibliothek ist noch nicht gebaut, es scheint von Log. Suchen Sie diesen Link zum Erstellen nativer Bibliothek - https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F..%2Findex#5 –

Antwort

1

um GetMethodID zu rufen, müssen Sie richtig Ihre C++ Thread zu dem Haupt Java-Thread anhängen. Wie folgt:

bool attachThreadToJVM(JNIEnv **env) 
{ 

    bool ret = false; 

    if(globalJavaVm != NULL) { 
     JavaVMAttachArgs vmAttachArgs; 
     vmAttachArgs.version = JNI_VERSION_1_6; 
     vmAttachArgs.name = NULL; 
     vmAttachArgs.group = NULL; 
     jint attachRet = globalJavaVm->AttachCurrentThread(env, &vmAttachArgs); 

     if(attachRet == 0) 
     { 
      ret = true; 
     } 
    } 

    return ret; 
}