2016-11-13 12 views
0

Androidの初心者で、C++で関数を使用してアプリを作成する必要があり、* .soファイルを提供しました。このようにAndroidは* .soのライブラリにリンクできません

src 
│    ├── main 
│    │   ├── java 
│    │   ├── jniLibs 
│    │   │   ├── armeabi 
│    │   │   │   ├── libjni_lib1.so 
│    │   │   │   ├── libjni_lib2.so 
│    │   │   │   ├── libjni_libn.so 

Y負荷それを::

は、私は次のディレクトリにある* .soのファイルを置く

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

しかし、私は、アプリケーションをデバッグするとき、次のエラーが発生します。

java.lang.UnsatisfiedLinkError: Native method not found: com.cloudpos.jniinterface.SmartCardInterface.smartcardInit:()I 
        at com.cloudpos.jniinterface.SmartCardInterface.smartcardInit(Native Method) 
        at cr.pf.com.controller.SmartCardController.searchBegin(SmartCardController.java:57) 
        at cr.pf.com.cr.MainActivity.onClick(MainActivity.java:134) 
        at android.view.View.performClick(View.java:4438) 
        at android.view.View$PerformClick.run(View.java:18439) 
        at android.os.Handler.handleCallback(Handler.java:733) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:136) 
        at android.app.ActivityThread.main(ActivityThread.java:5111) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:780) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:596) 
        at dalvik.system.NativeStart.main(Native Method) 

I /プロセス:送信信号。 PID:5364 SIG:9 アプリケーションが終了しました。

私はすでに* .soファイルを追加する方法を読んでおり、それらはすべてjniLibsフォルダに置いておきますが、どうすればいいですか?

+1

1).apkファイルはzipファイルです。apkファイルの名前を変更して、.soファイルがapkファイルに作成されたかどうかを確認するために解凍します。 2) 'smartcardInit(...)'を持つ.hと.c/C++ファイルを表示してください。 3)JavaのloadLibraryは従属する.soファイルをロードしないので、一番従属する.soファイルの第1番目のファイル、次に最も依存する.soファイルなどをロードする必要があります。 –

+0

私はすでにこれを行いました。他に何ができますか? – mareyes

+0

だから、あなたはそれを管理しましたか? –

答えて

0

loadLibrary()が例外をスローしなかった場合、soファイルは正しくインストールされている可能性が高くなります。私はまだloadLibrary()の後にログstttementを追加します - この静的コンストラクタが期待どおりに実行されたことを確認するためだけです。

多くの場合、ネイティブメソッドシグネチャが一致しない場合、ネイティブライブラリで想定されているパッケージ名がJavaアプリケーションで使用されているものと同じではないため、ライブラリはあらかじめビルドされているので発生します。

これは、Androidが、マニフェストで指定されているアプリケーションパッケージ名と同じJavaパッケージを使用することを推奨していることが原因で発生する可能性があります。しかし、どのクラスのJavaパッケージ名も自由に使用できます。

あなたはの.so のエクスポート関数の実際の名前を分析するために、NDKと一緒に配布され、期待されるJavaパッケージは、その由来することができるnmコマンドを使用することができます。

関連する問題