94

C++ で NDK を使用しようとしていますが、メソッドの命名規則が正しくないようです。私のネイティブメソッドは次のとおりです。

extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
   //
}
}

extern "C" {} でラップされたヘッダーを使用します。

すべてが正常にコンパイルされ、.so ファイルが作成され、プロジェクトの下の libs フォルダーにコピーされますが、Eclipse でデバッグして実行すると、「ネイティブの実装が見つかりません...」というログ キャット メッセージが表示され続けます。すべての NDK の例は C で書かれているので、私が見逃しているものはありますか?

ありがとう。

4

11 に答える 11

169

「実装が見つかりません」につながる可能性のあることがいくつかあります。1 つは関数プロトタイプ名が間違っていること、もう 1 つは .so のロードにまったく失敗していることです。System.loadLibrary()メソッドが使用される前に呼び出されていますか?

関数が定義されていない場合は、JNI_OnLoad関数を作成して、lib が正常に取り込まれたことを確認するためだけにログ メッセージを吐き出すことができます。

最も一般的な問題 (使用するのを忘れる) はすでに回避しているextern "C"ため、上記のエラーか、わずかなスペルミスのいずれかです。Java宣言はどのように見えますか?

于 2010-03-19T21:03:18.083 に答える
14

私は同じ問題を抱えていましたが、エラーはファイル Android.mk にありました。私はそれを持っていました:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES := B.cpp 

しかし、これが必要です:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES += B.cpp 

詳細に注意してください+=代わりに:=

それが役立つことを願っています。

于 2013-05-16T23:40:51.577 に答える
4

ndkのアプリの下にcppの例があります: https ://github.com/android/ndk-samples/blob/master/hello-gl2/app/src/main/cpp/gl_code.cpp

于 2010-02-05T01:49:12.840 に答える
4

追加の理由: android.mk で LOCAL_STATIC_LIBRARIES の代わりに LOCAL_WHOLE_STATIC_LIBRARIES を使用します。NDK は Java コードからのネイティブ バインディングの使用を検出できないため、ライブラリは未使用の API 呼び出しを最適化できなくなります。

于 2013-10-01T18:35:59.903 に答える
2

javah (Java SDK の一部) を使用します。まさにこれのためのツールです(.classファイルから.hヘッダーを生成します)。

于 2011-08-03T13:07:22.523 に答える