Windowsで開発している場合は、Visual Studioを使用してCコードをデバッグすることを強くお勧めします。 Javaプログラムを起動してSystem.loadにブレークポイントを置くことができます。この時点でJavaプログラムが停止し、Visual Studioにアクセスし、ツール>アタッチプロセスからCコードに置かれたブレークポイントで停止できます。その後、Javaコードを再開します。
1 - キャッシュJVMオブジェクト
JavaVM * javaVm;
(*jenv)->GetJavaVM(jenv, &javaVm);
2 - キャッシュお使いのJavaのコールバックメソッドを含むクラスのClassオブジェクト:CスレッドからJavaメソッドを呼び出すと、いくつかのpreperationが必要です。あなたは、インスタンスメソッドを呼び出す場合
clazz = (*jenv)->NewGlobalRef(jenv, (*jenv)->FindClass(jenv, "com/something/somepackage/SomeClass"));
3-、あなたはまた、あなたがへの呼び出しを行う必要がある場合(仮想マシンにネイティブスレッドを取り付け
callback = (*jenv)->NewGlobalRef(jenv, callbackInstance);
、4-
と呼ばれているインスタンスをcahceする必要があります。 Javaメソッド)
JNIEnv * jenv;
int errorCode = (*j_javaVm)->AttachCurrentThread(j_javaVm, (void**) &jenv, NULL);
5 - あなたはJavaのメソッドへの呼び出しを行う必要がある場合
)(呼び出す必要があり、メソッドIDを取得します。
jmethodID methodID = (*jenv)->GetMethodID(jenv, cachedhandlerClass, "methodNameHere", "methodSignetureHere");
6メソッド呼び出し
(*jenv)->CallVoidMethod(jenv, cachedCallbackInstance, methodID, param1, param2,....);
7 deattachネイティブスレッド
(*j_javaVm)->DetachCurrentThread(j_javaVm);
ステップ1,2及び3は、Java環境を必要とし、彼らがJNI_OnLoad方法で行うか、することができますしてくださいネイティブJavaメソッドの実装では、
ここをクリックしてください:https://stackoverflow.com/a/12900986/3699139 'JNIEnv *'は、nativeを呼び出すスレッドに対してのみ有効です。 –
@JornVernee他に提案がありますか? – ram
申し訳ありませんが、それは私の唯一の推測でした。 –