web-dev-qa-db-ja.com

ndk-buildの出力場所を変更する

私のアプリの構造は次のとおりです

_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
_

出力をさまざまな場所で生成したい:

  1. libsjniLibs。すなわち。 _./app/src/main/jniLibs/armeabi*_
  2. いずれかのビルドフォルダーの下の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'
_
18
madlymad

どうやってそれを解決するか。エレガントではありませんが、少なくとも機能します。

私のビルドメカニズムは非常に複雑なので、カスタムの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を変更しただけなので、そのままにしておきます。

1
madlymad

NDK_LIBS_OUTを使用してlibs出力を変更し、NDK_OUTを使用してobj出力を変更できます。このように:ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj

33
Chen Vitor

利用可能なすべてのアーキテクチャ用にビルドする必要がある場合は、引数を使用してください:

    TARGET_OUT='<your_build_dir>/$(TARGET_Arch_ABI)'

ターゲットアーキテクチャが1つで十分な場合は、引数を使用します。

    TARGET_OUT=<your_build_dir>
5
Kalle

出力場所を指定するためのより良い、より簡単な方法は、リンク 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とビルド、完了。

0
rosuh