2016-05-13 6 views
-1

私はAndroidで起動したいCプロジェクトを持っています。アンドロイドアプリケーションからCバイナリを実行:特定の場合

NDKを使用してプロジェクトをコンパイルし、バイナリを生成してアプリケーションに埋め込んで起動しました。 このプロジェクトでは、自動ツールを使用して、androgenizerを使用してAndroid.mkを生成して調整しました。 これはopensslも使用していますので、thisの後にアンドロイド用にコンパイルし、バイナリを使用してlibcrypto.soをコンパイルしました。

アプリケーションのみ行います

  • ロードlibcrypto.so
  • コピーバイナリ
  • が実行ここ

がコードの一部であるバイナリ

Process mybinProcess; 
File target = new File(getFilesDir(), "mybin"); 
InputStream in = getResources().openRawResource(R.raw.mybin); 

try { 
    OutputStream out = new FileOutputStream(target); 
    FileUtils.copy(in, out); 
    FileUtils.chmod(target, 0755); 

if(target.exists()){ 
    String[] command = {target.getAbsolutePath()}; 
    mybinProcess = Runtime.getRuntime().exec(command); 
    BufferedReader output = FileUtils.getOuput(mybinProcess); 
    BufferedReader error = FileUtils.getError(mybinProcess); 

    // [...] print stdout et stderr 

    mybinProcess.waitFor(); 
    int exitval=mybinProcess.exitValue(); //exit value is 1 

stdoutは私にバイナリのyntaxエラー:私はadbのシェルからバイナリを起動しようとしたとき、私はバイナリエディタでmybinを開いた

[email protected]_x86:/data/user/0/com.myproject/files # ./mybin 
/system/bin/sh: ./mybin: not executable: 32-bit ELF file 

そのエラーを持って、

/data/data/com.myproject.mybin/files/mybin[1]: syntax error: ' 4 4' unexpected 

は、構文エラーが前に来ますlib /usr/lib/libc.so.1の文字列。しかし、エミュレータではディレクトリ/usrは存在しません。私はそれがndk-buildの最後のコンパイルラインから来ると思います。<ndk>/platforms/android-19/arch-arm/usr/libからインクルードしてください。また、<ndk>/platforms/android-19/arch-arm/usr/libにはlibc.soがあり、libc.so.1ではありません。

どこで私がそれを修正するために検索することができますか、それを動作させるか?


マイ設定:

  • NDK:端辺R11c
  • Androidプラットフォーム:19
  • アンドロイドメーカー:2.1
  • SDK:r24.4.1
  • mybin(NDK)のコンパイルWindows上のLinuxとapk(Androidスタジオ)

答えて

2

Androidで実行する実行ファイルを構築するには正しいアプローチIMOではなく、possibleです。ネイティブバイナリライブラリへのJNIインターフェイスを構築し、Cライブラリを呼び出す必要があります。

ここに簡単な例があります:

http://developer.android.com/ndk/samples/sample_hellojni.html

は、あなたがJNI呼び出しの多くを持っている場合我々は、JNIコードを生成するためにjavacppを使用して多くの成功がありました。あなたは1つまたは2つのコールが必要な場合は、私はおそらくそれを手で書くだろう。

+0

私はライブラリとして私のCコードを使用する場合、私はJavaでプロジェクト全体を書き直す必要があります。私はAndroid上でバイナリを直接起動したいので、ndkビルド実行可能命令に続いて使用できない実行可能ファイルを生成しました... –

+1

@ raja.b 'Cコードをライブラリとして使用すると、プロジェクト全体を書き直す必要がありますJavaで私はあなたに従うか分からない。私はCコードをそのまま残しておくことをお勧めしますが、Cコードを実行可能ファイルとしてビルドする代わりに、ライブラリからデータを取得するための1つまたは2つのメソッドを持つCライブラリを作成します。次に、Java側で同じJNIメソッドを作成して、それとインタフェースします。コマンド・インターフェースを扱い、出力からテキストを削るよりもずっと簡単です。あなたがこれまでに働いていれば、すべてのデバイスでうまく動作しないかもしれません。 –

+0

@GaryBack 'コマンドインターフェイスを扱い、出力からテキストをスクラップするよりもずっと簡単です。 '。現時点では、テキスト出力を処理する必要はありません。これは、バイナリを実行した後に、Javaのサイドを使用してインタフェースを最適なオプションにする、さらなるステップです。私が理解していないのは、ndkによって生成されたバイナリがターゲットプラットフォームと互換性がない(32ビットエラー、構文エラー)という事実です。 –

関連する問題