4

Android アプリケーションの開発を開始し、次のチュートリアルに従いました。

http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/ しかし、アプリケーションは機能しませんでした。私はそれをデバッグし、ログの猫はこのメッセージを示しています: JNI_Onload が見つかりません..どうすればこの問題を解決できますか?

ありがとう

4

2 に答える 2

9

JNI_OnLoad 関数の主な目的は、すべてのネイティブ メソッドを登録することです。

これは推奨される方法ですが、唯一の方法ではありません。したがって、JNI_OnLoad 関数の提供はオプションです。すべてのネイティブ メソッドを登録するために使用されるため、メソッドが実際に使用される前に、Java ネイティブ メソッド宣言とその C/C++ 対応部分との間の署名の不一致を検出できます。

代わりに、次のように静的クラス初期化子からネイティブ ライブラリをロードすることもできます。

static {
    System.loadLibrary("mylib");
}

そうすれば、JNI_OnLoad 関数を提供する必要がなくなり、'mylib' 内のすべてのネイティブ メソッドが自動的に検出されます。唯一の欠点は、実際に呼び出すまで、ネイティブ メソッド シグネチャの一部が間違っているかどうかがわからないことです。その場合、'unsatisfiedlinkerror' が表示され、呼び出そうとしたネイティブ メソッドの実装が見つからないことが通知されます。

このオプション (オプション 2 - 自動検出) を使用する場合、デバッグ レベルのメッセージは、JNI_OnLoad 関数を提供するのを「忘れた」ことを伝える単なる警告になるため、無視してかまいません

詳細については、JNI のヒントを参照してください:
http://developer.android.com/guide/practices/jni.html

于 2012-08-26T03:43:12.877 に答える
4

JNI_OnLoad は、関数が見つからなかったことを知らせるデバッグ レベルのメッセージです。

これは、'extern "C"' 宣言をせずに JNI_OnLoad を書くことがあり、それが機能しない理由がわからないことがあるからです。

あなたが直面している問題は、おそらくメッセージとは無関係です。手がかりについては、近くの logcat 出力を見てください。dlopen() の失敗と Java 例外が関連している可能性があります。

その一部を質問に貼り付け、おそらく失敗をより詳細に説明する必要があります(「機能しなかった」は少しあいまいです)。

于 2011-02-08T00:42:39.153 に答える