2016-08-09 57 views
4

を見つけることができませんでした。ここでJNIは、アプリケーション内でエラーを検出:JNIは、保留中の例外にjava.lang.ClassNotFoundExceptionと呼ばGetMethodIDが:私は次のようなエラーになっていますクラス

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) 

のエラーの詳細です。 GetMethodIDを呼び出すために

`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

これはクラッシュログです。ネイティブC++スレッドからJavaモジュールにコールバックを送信しようとしています。私はattachCurrenThreadを呼び出すことによってメインスレッドにアタッチしましたが、ネイティブスレッドからGetMethodID関数を呼び出すとこのクラッシュが発生します。 GetMEthodIDに渡されたjclassがnullではありません。 – andy

+1

あなたが壊れた正確な行を提供できれば、本当に役立つでしょう。私はあなたの問題は、メソッドの正確な署名であると仮定します。 100%は確実ではありません。より正確なブレークポイントを指定すると助けになります。 – Tancho

+0

ネイティブライブラリはまだビルドされていません。 このリンクを参照してネイティブライブラリを構築してください - https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F..%2Findex#5 –

答えて

1

、あなたは正しく、メインのJavaスレッドにあなたのC++スレッドを添付する必要があります。このように:

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; 
} 
関連する問題