3

先日も質問させていただきましたが、あまり具体的ではなかったので、再確認したいと思います。

NDK を使用して C の既存のライブラリを使用する Android アプリケーションを作成しています。私が遭遇した問題は、CコードがJavaにはない多くのものを使用していることです(パラメーターとしての関数ポインターが大きな問題です)。

とにかく、C コードが呼び出す関数を Java コードに記述できるかどうか疑問に思っていました。今、私が知る限り、あなたはそれを行うことができるので、誰も「はい、できます、LINK」と答えなかったら幸いです. .

誰でもプロセスを説明できますか? CコードでJVMを作成する必要があることは知っています。初心者が足を踏み入れるのに役立つ情報は大歓迎です。

ありがとう

編集 :

だから、私はこれらの3つのステップのために何をすべきかわかりません。

To call a specific Java function from C, you need to do the following:

Obtain the class reference using the FindClass(,,) method.
Obtain the method IDs of the functions of the class that you want to call using the 
GetStaticMethodID and GetMethodID function calls.

Call the functions using CallStaticVoidMethod, CallStaticIntMethod, and CallStaticObjectMethod.

これはあまり説明されておらず、私は文字通り C の経験がありません。FindClass は C メソッドですか?

4

1 に答える 1

4

JNI を介して Java から呼び出し可能なすべての C 関数には、 type の最初のパラメーターがありますJNIEnv*。C 側では、これは関数へのポインターの束を持つ構造体へのポインターへのポインターです。これらの関数は、Java の世界へのインターフェースです。FindClassGetMethodID残りはその中にあります。

したがって、C 側から FindClass を呼び出したい場合は、次のようにします。

void Java_com_mypackage_MyClass_MyMethod(JNIEnv *jniEnv, jobject thiz)
{
    jclass *clazz = (*(*jniEnv)->FindClass)(jniEnv, "com/mypackage/SomeClass");
    jmethodID MethodID = (*(*jniEnv)->GetStaticMethodID)(jniEnv, clazz, "SomeMethod", "(I)I");
    int result = (*(*jniEnv)->CallStaticIntMethod)(jniEnv, clazz, MethodID, 18);

などなど。この行は、パラメーターを逆参照しjniEnv、関数ポインターを取得して、それを介して関数を呼び出します。クラスとメソッドの名前は、当然のことながら完全に偽物です。どうすればあなたのことを知ることができますか。

注: ここでは関数ポインターについて話していますが、あなたと同じ意味ではありません。これらは、ユーザーの関数ではなく、JNI が提供する関数への関数ポインターです。

呼び出し構文の冗長性は、C の制限に関係しています。C++では、代わりに書くことができます

jclass *cl = jniEnv->FindClass("com/mypackage/SomeClass");

C++ は、仮想関数を介してこの種の関数テーブル ポインターをネイティブにサポートしているためです。

途中でいくつかのショートカットを取ることができます。C のエントリ ポイントと同じクラスのメソッドを呼び出していて、それがたまたま静的である場合、2 番目のパラメーターは既にクラス オブジェクト ポインターです。thisメソッドを呼び出したいオブジェクトへのポインターがある場合は、 GetObjectClass を使用できます。

于 2012-07-25T01:16:07.213 に答える