2017-03-07 13 views
0

ネイティブコードのバイナリを含むPlayストアからAPKをダウンロードしました。 APKファイルには、lib/x86フォルダがあります。このフォルダには、ネイティブプロシージャを含むライブラリファイル(通常は.so拡張子)が含まれています。コードはx86であるため、Javaプログラムを記述してデスクトップ上のライブラリを呼び出すことは可能ですか?あなたがそのライブラリのソースコードを持っていなくても。 NDK関数はパラメータを受け取り、値を返すだけです。たとえば、書き込むことができますLinuxデスクトップでAndroid NDKバイナリを実行しています

class AppNativeLoader 
{ 
    public static native void generateRand(int seed); 

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

public class WCallTest 
{ 
    public static void main(String[ ] args) 
    { 
     long seed = System.currentTimeMillis(); 

     if(args.length > 0) { 
      seed = Long.valueOf(args[0]); 
     } 

     long rand = AppNativeLoader.generateRand(seed); 

     System.out.println(rand); 
    } 
} 

注:これは単なる例です。実際の環境は異なります。 RHELでJRE 7を使用して、x86の.soを展開し、.classファイルと同じディレクトリに配置しました。私はまだUnSatisfiedLinkerErrorを得る。何か気まずい?コールバックがなく、関数がAndroid APIを利用していないと仮定すると、これは可能ですか?

編集:私は、IDA Proでlibが開かれて、私は次の依存

.plt:0000B100 ; Needed Library 'liblog.so' 
.plt:0000B100 ; Needed Library 'libz.so' 
.plt:0000B100 ; Needed Library 'libc.so' 
.plt:0000B100 ; Needed Library 'libm.so' 
.plt:0000B100 ; Needed Library 'libstdc++.so' 
.plt:0000B100 ; Needed Library 'libdl.so' 

これらはなし、私のデスクトップ環境で利用可能であるべきであるのを見ましたか?

答えて

1

すべてのLinux環境が同一であるとは限りません(交差配布境界でも動作することは保証されていません)。 NDKバイナリは、Bionicやその他のAndroid固有のライブラリのいくつかに対して構築されていますが、RedHatシステムではglibcやRedHatリポジトリから入手可能な他のものを使用しています。

tl; drデスクトップのLinuxでAndroidバイナリを実行することはできません。

+0

次に、なぜAPKにx86ライブラリが提供されていますか? Windows BlueStacksエミュレータの仕組みは? UnsastifiedLinkerErrorに互換性がないという症状が出ていますか? – Nederealm

+0

私はIDA PROでライブラリを開きました。私は以下の依存関係を見ました。plt:0000B100;必要なライブラリ 'liblog.so' .plt:0000B100;必要なライブラリ 'libz.so' .plt:0000B100;必要なライブラリ 'libc.so' .plt:0000B100;必要なライブラリ 'libm.so' .plt:0000B100;必要なライブラリ 'libstdC++。so' .plt:0000B100;必要なライブラリ 'libdl.so' – Nederealm

+0

x86のAndroidデバイスがあるためです。 –

0

hereから必要な共有ライブラリをダウンロードすることができます(正しいAPIバージョンを選択し、NDK共有ライブラリのアーキテクチャに合ったアーキテクチャを選択して、必要な共有ライブラリを見つけてください)。ldd

共有ライブラリによって公開されているメソッドに簡単にアクセスするには、jadxを使用してアプリケーションのJavaコードを逆コンパイルしてから、JNIクラスの周りに独自のコードを記述します。

Javaコードをコンパイルするには、JDKの任意のバージョンを使用できます。

これを実行するには、NDK共有ライブラリのアーキテクチャに一致するバージョンのJREを使用する必要があります(この場合、32ビットJREをダウンロードする必要があります)。

しかし、これは動作することが保証されていません:私は現在、私のPCで使用しようとしているNDK共有ライブラリにsegfaultsを取得しています、そしてほとんどのNDKバイナリは取り除かれているので、デバッグは悪夢になります。

関連する問題