2017-06-14 57 views
0

我想從android的NDK在C++中的分離線程調用java靜態方法。從ndk中的不同線程調用java方法

到目前爲止,我:

JNIEnv *env =AttachJava(); 

    jclass cls2 = env->FindClass("com/actvt/showdown/pluggin/Utils"); // try to find the class 
    //jmethodID mid2 = env->GetStaticMethodID(cls2, "AddSound", "(Landroid/app/Activity;Ljava/lang/String;I)V"); // find method 
    jmethodID mid = env->GetStaticMethodID(cls2, "addFrame", "(Landroid/app/Activity;JIIII)V"); // find method 
    jclass dataClass = env->FindClass("android/app/Activity"); 
    jobject javaClassRef = env->AllocObject(dataClass); 
    env->CallStaticVoidMethod(cls2, mid,javaClassRef,(long)frame,0,footageIndex,frameNumber,width,height); 

而且我這個線程連接到與被叫AttachJava至極的JVM是:

JNIEnv* Wrapper::AttachJava() 
{ 
    JNIEnv* myNewEnv; 
    JavaVMAttachArgs args; 
    args.version = JNI_VERSION_1_6; // choose your JNI version 
    args.name = nullptr; // you might want to give the java thread a name 
    args.group = nullptr; // you might want to assign the java thread to a ThreadGroup 
    Wrapper::jvm->AttachCurrentThread(&myNewEnv, &args); 
    return myNewEnv; 
} 

,我有在下面的錯誤運行時間:

06-14 10:04:31.548 32423-484/com.learnopengles.airhockey A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: JNI GetStaticMethodID called with pending exception java.lang.ClassNotFoundException: Didn't find class "com.actvt.showdown.pluggin.Utils" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]] 
06-14 10:04:31.548 32423-484/com.learnopengles.airhockey A/art: art/runtime/java_vm_ext.cc:470] at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56) 
06-14 10:04:31.548 32423-484/com.learnopengles.airhockey A/art: art/runtime/java_vm_ext.cc:470] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380) 
06-14 10:04:31.548 32423-484/com.learnopengles.airhockey A/art: art/runtime/java_vm_ext.cc:470] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) 

如果你需要什麼更多我在您的處置

問候,

+0

你是如何調用'pthread_create'? – pskink

+0

您好我正在創建新的線程: std :: thread recordThread(&Recording :: WaitForExport,this,&recorder,capture); recordThread.detach(); – user1796260

+0

對不起,我只使用[pthreads](https://en.wikipedia.org/wiki/POSIX_Threads) – pskink

回答

1

解決我的問題是保持到我需要在我不同的線程在NDK呼叫begginning的所有類的引用開始我的線程之前和使用它們的線程裏面。我也可以將它們作爲參數提供給線程。

發現了這件事thans到pskink並根據此文件:https://developer.android.com/training/articles/perf-jni.html#faq_FindClass

+1

強烈建議只准備一次所有的方法ID,以避免(顯着)'GetXXXMethodID( )'。請注意,方法ID是簡單數字,不依賴於線程,(與類不同)不需要全局引用。 –

相關問題