JNIを介してC++コードを呼び出してブロック操作を開始するAndroid/Javaアプリケーションがあります。 C++コードはこのブロック操作を行うためにスレッドを開始し、終了するとJNIをコールバックする必要があります。pthreadからオブジェクトを初期化するときに "NoSuchMethodError"が発生する
C++への呼び出しは問題なく動作します。しかし、JNIに電話をかけると、さまざまなエラーが報告されています。
新しいスレッドからjclass
参照を取得することは明らかに法的ではありません。私は、Javaコードにコールバックしようとしているこれらのスレッドの1で
static jclass sampleClazz;
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
jvm = vm;
JNIEnv* env = NULL;
jint result = jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
if(env == NULL) { __android_log_print(ANDROID_LOG_DEBUG, "JNI_OnLoad", "NULL");}
sampleClazz= env->FindClass("com/sample/SampleClazz");
sampleClazz= (jclass) env->NewGlobalRef(sampleClazz);
...etc...
}
:そのアクションを実行するので、すべてのクラスのルックアップのはJNI_OnLoad()
方法で行われ、このように見えるされている「予期しない動作」を与えます。コールバックメソッドは、次のようになります。
void cCallBackOne() {
JNIEnv* env;
jvm->AttachCurrentThreadAsDaemon(&env, NULL);
jmethodID init = env->GetMethodID(sampleClazz, "<init>", "()V");
if(init == NULL) {
__android_log_print(ANDROID_LOG_DEBUG, "START", "NULL HERE");
} else {
__android_log_print(ANDROID_LOG_DEBUG, "START", "ALL FINE");
}
残念ながらいくつかの未知の理由でこのログインしている/投げ:
Exception Ljava/lang/NoSuchMethodError; thrown while initializing Lcom/sample/SampleClazz;
NULL HERE
異なるソリューションの私がするためにJNI_OnLoad
方法にGetMethodId
を移動しようとしたての作業中元のJavaスレッドからメソッド参照を正しく引き出すことができるかどうかを確認してください。それはうまく動作します...しかし、私はこれを行うと、不思議なことですコールバック内のコードも動作し始めます。
私は大規模に困惑しています。私は何が起こっているのか分かりませんし、次に何を試していいのか分かりません。
ブロックされていても、スレッドを開始する理由は何ですか?あなたは同じスレッドで仕事をすることができるように聞こえる... –
Javaでスレッドを作成しようとしましたか?それは私が操作をブロックするために行うもので、正常に動作します。それで、問題のあるCからJavaへのコールバック・メカニズムを混乱させる必要はありません。 – BitBank
私は正当な理由で私がやっていることを確認することができます。 – Graeme