私のアプリの構造は次のとおりです
_Android
|
|-> app
| |
| |-> build [1]
| |-> src
| | |-> main
| | | |-> assets
| | | |-> Java
| | | |-> jni
| | | | |-> Android.mk
| | | | |-> Application.mk
| | | |
| | | |-> jniLibs
| | | | |-> armeabi
| | | | |-> armeabi-v7a
| | | |
| | | |-> res
| | | |-> AndroidManifest.xml
|
|-> build [2]
_
Linuxマシンで_.so
_コマンドを使用して_ndk-build
_ライブラリを構築しています。私はそれを次のように使用します:
_<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
_
ビルドプロセスは正常に機能し、出力ファイルはエラーなしで生成されます。
私の問題は、結果ファイルが「適切な位置に向けられていない」ということです
で生成されたlibs
:
_.app/src/main/libs/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/libs/armeabi/libMyGeneratedLibrary.so
_
およびobj
ファイル:
_.app/src/main/obj/local/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/obj/local/armeabi/libMyGeneratedLibrary.so
_
出力をさまざまな場所で生成したい:
libs
のjniLibs
。すなわち。 _./app/src/main/jniLibs/armeabi*
_obj
。すなわち。 build
[1]またはbuild
[2]。一部のパラメーターを_.mk
_ファイルまたはビルドコマンドに変更することでそれを実現する可能な方法はありますか?
編集
_TARGET_OUT
_はNDK r6bでは機能しないようです
コマンドの実行ndk-build -C Android/app/src/main/ TARGET_OUT='Android/app/src/main/jniLibs/$(TARGET_Arch_ABI)'
生成されたファイルごとに、以下のような警告が表示されます。
_Android-ndk-r6b/build/core/build-binary.mk:217: warning: overriding commands for target 'Android/app/src/main/jniLibs//objs/***/****.o'
Android-ndk-r6b/build/core/build-binary.mk:217: warning: ignoring old commands for target 'Android/app/src/main/jniLibs//objs/***/****.o'
_
どうやってそれを解決するか。エレガントではありませんが、少なくとも機能します。
私のビルドメカニズムは非常に複雑なので、カスタムのGradleタスクとスクリプトもいくつかありましたが、ビルドの単一のコマンドはそれほど重要ではありません。
だから私はそのままビルドコマンドを続けました
<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
フォルダーの作成を追加します(-pが存在してもエラーを生成しません)
mkdir -p <my_project_path>/Android/app/src/main/jniLibs/
次に、syncコマンドを使用して.soファイルを最終的な場所に移動します。
rsync -avh --remove-source-files \
<my_project_path>/Android/app/src/main/libs/* \
<my_project_path>/Android/app/src/main/jniLibs/
obj
フォルダーに対しても同様のことができます。 .gitignoreを変更しただけなので、そのままにしておきます。
NDK_LIBS_OUT
を使用してlibs出力を変更し、NDK_OUT
を使用してobj出力を変更できます。このように:ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj
利用可能なすべてのアーキテクチャ用にビルドする必要がある場合は、引数を使用してください:
TARGET_OUT='<your_build_dir>/$(TARGET_Arch_ABI)'
ターゲットアーキテクチャが1つで十分な場合は、引数を使用します。
TARGET_OUT=<your_build_dir>
出力場所を指定するためのより良い、より簡単な方法は、リンク Gradle to your native library をリンクすることです。その後、buildStagingDirectory
ブロックのndkBuild
オプションを使用して、出力場所を指定します。
Android {
externalNativeBuild {
ndkBuild {
// Tells Gradle to put outputs from external native
// builds in the path specified below.
buildStagingDirectory "src/main/libs"
}
}
}
次に、Sync Gradle
とビルド、完了。