2016-06-01 10 views
0

Androidスタジオ2.1.1に追加した.soファイルがあります。すべてがうまくいき、.soファイルからメソッドを呼び出すことができます。唯一のことは、それが動作するためには、私のアプリの非常に特定の部分からネイティブメソッドを呼び出す必要があるということです。Androidアプリで.soファイルを使用する

例のメソッド名はJava_com_test_app_MainView_myMethodなのでcom.test.appという名前のパッケージでMainViewというクラスからmyMethodを呼び出す必要があります。

MainViewからSubViewに名前を変更した場合、java.lang.UnsatisfiedLinkError: Native method not found: com.test.app.SubView.myMethodとなります。

これはこのように動作するはずですか、何か不足していますか?

+1

_ "これはこのように動作するはずですか?ほんとうに、そうです。いくつかのIDEは、この種の名前変更を行うのに役立つかもしれません。ネイティブコードで 'registerNatives'を使うこともできます。 – Michael

答えて

2

これは実際にこのように動作するはずです。 JNIのメソッド名は、_形式のJavaメソッド名を反映する必要があります。

thisドキュメントから、次の規則を守らなければなりません。

ネイティブメソッド名の解決

ダイナミックリンカーは、その名前に基づいてエントリを解決します。ネイティブメソッド名は、以下の成分から連結されている:

  • マングル完全修飾クラス名
  • 下線(「_」)セパレータ
  • マングルメソッド名オーバーロードされたネイティブメソッドの
  • 、 2つのアンダースコア( "__")の後ろに引数の署名がついています。
+0

異なる完全修飾クラス名を使用するいくつかの.soファイルがある場合、私はそれらをアプリケーションの同じクラス内で使用することはできませんか? Xamarinを使う私は 'com.test.app.MainView'内で' myMethod'を呼び出すのではなく、まっすぐな 'Java_com_test_app_MainView_myMethod'を使うので、私はそのような問題はありません。だから、Javaではそのようなことはできませんか? – user276648

+0

@ user276648通常、この問題は回避できますが、すべてのネイティブメソッドが単一のクラスから呼び出されるようにすることはできますが、特にネイティブメソッドがJavaオブジェクト参照を使用する場合は、常にそうすることはできません。他のすべてのケースでは、この解決策は実現可能ですIMO –

+0

OK、私は本当に別のプロジェクトから.soファイルを再利用することはできません。正しい完全修飾クラス名を使用して、毎回新しいクラスを再作成する必要があります。 – user276648

関連する問題