私はこれに固執しています。私はc/C++からJava関数を呼び出す必要があります。cからJava関数を呼び出す方法
例とチュートリアルでは、私はcメソッドを呼び出すjavaアプリケーションを見ています。この同じメソッドでは別のJavaメソッドを呼び出しますが、コードのどの部分からでもJavaメソッドを呼び出すだけです。
static JNIEnv mEnv;
static jclass mClassAndroidActivity;
static mMethodSayHello;
JNIEXPORT void JNICALL JNI_FUNCTION(AndroidActivity_nativeInit)(JNIEnv* env, jobject obj, int width, int height)
{
mEnv = env;
jclass cls = (*env)->GetObjectClass(env, obj);
mClassAndroidActivity = (*env)->NewGlobalRef(env, cls);
mMethodSayHello = (*env)->GetMethodID (env, mClassAndroidActivity, "SayHello", "(Ljava/lang/String;)V");
}
//this method is called from a cpp
void nativeSayHello(char* msg)
{
jstring string = (*mEnv)->NewStringUTF(mEnv, msg);
(*mEnv)->CallVoidMethod(mEnv, mClassAndroidActivity, mMethodSayHello, string);
}
が、常にクラッシュし、私が代わりにJNI_Function内のenvのmEnvを使用して、NewGlobalRefせずに試してみたさに、私がJNI_OnLoadからメソッドIDを取得しようとしましたが、常にクラッシュ:これは私が持っているものです。 09::
2月15日18:48.520:dalvikvm/W(27904):JNI WARNING:スレッドID = 0
'スレッド1からのenvがスレッド0とは違うと言われる「最良の」ログ'これは正しいと私は信じている。 Javaスレッドごとに異なるenvポインターが必要です。 – Yourpalal
ええ、私は別のスレッドで使用することができるように最初のenvポインタを保存することができます –