私は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スタジオ)
私はライブラリとして私のCコードを使用する場合、私はJavaでプロジェクト全体を書き直す必要があります。私はAndroid上でバイナリを直接起動したいので、ndkビルド実行可能命令に続いて使用できない実行可能ファイルを生成しました... –
@ raja.b 'Cコードをライブラリとして使用すると、プロジェクト全体を書き直す必要がありますJavaで私はあなたに従うか分からない。私はCコードをそのまま残しておくことをお勧めしますが、Cコードを実行可能ファイルとしてビルドする代わりに、ライブラリからデータを取得するための1つまたは2つのメソッドを持つCライブラリを作成します。次に、Java側で同じJNIメソッドを作成して、それとインタフェースします。コマンド・インターフェースを扱い、出力からテキストを削るよりもずっと簡単です。あなたがこれまでに働いていれば、すべてのデバイスでうまく動作しないかもしれません。 –
@GaryBack 'コマンドインターフェイスを扱い、出力からテキストをスクラップするよりもずっと簡単です。 '。現時点では、テキスト出力を処理する必要はありません。これは、バイナリを実行した後に、Javaのサイドを使用してインタフェースを最適なオプションにする、さらなるステップです。私が理解していないのは、ndkによって生成されたバイナリがターゲットプラットフォームと互換性がない(32ビットエラー、構文エラー)という事実です。 –