ホームページ >バックエンド開発 >C++ >Android でネイティブ C から Java メソッドを呼び出すと「NoSuchMethodError」が発生するのはなぜですか?

Android でネイティブ C から Java メソッドを呼び出すと「NoSuchMethodError」が発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 15:30:03556ブラウズ

Why am I getting a

Android のネイティブ C から Java メソッドを呼び出す

Android で Java と C コードを統合する場合、Java メソッドを Android から呼び出すことが必要になる場合があります。ネイティブ C コード。この記事では、「getJniString」メソッド内のネイティブ コードから「messageMe」という名前の Java メソッドを呼び出そうとするときに直面する特定の問題について説明します。

提供されたコード スニペットでは、開発者はネイティブから「messageMe」を呼び出そうとしています。 「getJniString」メソッド内のC。ただし、コンパイルは「NoSuchMethodError」例外で失敗し、メソッド名が間違っていることを示します。

問題は、ネイティブ コードでの「messageMe」メソッドの呼び出し方法にあります。

<code class="cpp">jobject result = env->CallObjectMethod(jstr, messageMe);</code>

ここで、「jstr」変数はメソッドを呼び出す必要がある Java オブジェクトを表し、「messageMe」はメソッド ID を指します。ただし、「messageMe」は (Java コードで定義されている)「MainActivity」クラスのメソッドであるため、「CallObjectMethod」に直接渡すことはできません。これは、「jstr.myMethod()」を呼び出すことと同じになるためです。不正解です。

この問題を解決するには、ネイティブ コードは次のように、"MainActivity" クラスのインスタンスを表す "obj" 変数を "CallObjectMethod" に渡す必要があります。

<code class="cpp">jobject result = env->CallObjectMethod(obj, messageMe);</code>

さらに、「messageMe」メソッドが (指定されたコード内でのとおり) void として定義されている場合は、「CallObjectMethod」の代わりに「CallVoidMethod」を使用する必要があります。

<code class="cpp">env->CallVoidMethod(obj, messageMe, jstr);</code>

結果が期待される場合値を返すには、「messageMe」メソッド、Java コード、および JNI シグネチャを変更する必要があります。

以上がAndroid でネイティブ C から Java メソッドを呼び出すと「NoSuchMethodError」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。