15

皆さん、

サードパーティの .so ライブラリが必要な Android アプリケーションに取り組んでいます。私はこのサードパーティのライブラリ (ndk-build を使用) を指示に従ってビルドし、この .so を Android プロジェクトに含めることを検討していました。

したがって、docs/PREBUILTS.html に記載されている手順に従い、jni/prebuilt ディレクトリに新しい .so を正常にビルドしました。ここで、単純なテスト Android アプリで .so 機能を利用してみました。だから私がすることは:

static {
  Log.i("load so > ","load so");
  System.loadLibrary("xyz");
   }
/* The native functions */
private static native int openFile(String filename);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try{
        String path =  getPathForDownloadDirectoryFile();
        Log.i("file path> ", path);
        int num= openFile(path);
    }catch(Exception e){
        Log.e(">", "could not open the file");
    }
}

今、アプリを実行すると、次のようなデバッグ メッセージが表示されます: No JNI_OnLoad found in /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738, skipping init and then the application shuts down.

詳細については、次のエラー ログを参照してください。

No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0,   skipping init
W/dalvikvm(  570): No implementation found for native    Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I
D/AndroidRuntime(  570): Shutting down VM
W/dalvikvm(  570): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
E/AndroidRuntime(  570): FATAL EXCEPTION: main
E/AndroidRuntime(  570): java.lang.UnsatisfiedLinkError: Native method not found:  com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I
E/AndroidRuntime(  570):    at com.example.mysecondapp.MainActivity.openFile(Native  Method)
E/AndroidRuntime(  570):    at   com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31)
E/AndroidRuntime(  570):    at android.app.Activity.performCreate(Activity.java:5008)
E/AndroidRuntime(  570):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
E/AndroidRuntime(  570):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
E/AndroidRuntime(  570):    at    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
E/AndroidRuntime(  570):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
E/AndroidRuntime(  570):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
E/AndroidRuntime(  570):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  570):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(  570):    at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(  570):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  570):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(  570):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(  570):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(  570):    at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  146):   Force finishing activity com.example.mysecondapp/.MainActivity

ご覧のとおり、openFile() メソッドのネイティブ実装は見つかりませんでしたが、同じ xyz.so lib がサードパーティの元のサンプル アプリでうまく機能しました。私は Android-ndk world の初心者です。

Java-Android-NDK Ninjas ..何が不足しているのか推測できますか? ここで何か助けていただければ幸いです:)

4

4 に答える 4

17

ガイコールが言ったように、「No JNI_OnLoad」は単なる警告です。問題は別の場所にあります。

「so」ファイルを正常にコンパイルしたとおっしゃったように、問題は c/C ++ コード内の関数シグネチャにある可能性があります。

JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f)
{
//some action

}

関数シグネチャは、javah ツールを使用して生成されたヘッダー ファイルから取得されます。ヘッダー ファイルを生成し、パッケージ名で関数シグネチャを使用する必要があります。パッケージ名とクラス名が異なると、ヘッダー ファイルと対応する関数シグネチャが変わります。

worked pretty neat with the original sample app from the third party

これが、アプリではなくサンプル アプリで実行される理由である可能性があります。

参照: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

于 2012-09-27T17:05:32.897 に答える
6

「No JNI_OnLoad」メッセージは単なる警告です。JNI_OnLoad はオプションの初期化フックです。

あなたの問題は openFile() メソッド内にあると思います。Java からの呼び出しをコメントアウトしてみて、どこまで到達できるかを確認してください。

http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.htmlに、JNI といくつかのサンプル コードに関するブログ投稿があります。

幸運を。

于 2012-09-27T16:46:44.590 に答える
2

また、このログが付属しています

??-?? ??:??:??.???: INFO/(): java.lang.UnsatisfiedLinkError: ロードできませんでした* : findLibrary が null を返しました

右??

android.mk ファイルの問題だと思います。1:arabi v7 に切り替えてみます。2:load 関数は open() を呼び出します。そうの許可を確認してください。

于 2012-10-16T11:51:15.313 に答える