更改ndk-build输出位置

时间:2015-06-16 10:32:31

标签: android android-gradle 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/

构建过程正常,输出文件没有错误。

我的问题是结果文件没有“定向到正确的位置”

{:1}}生成于:

libs

.app/src/main/libs/armeabi-v7a/libMyGeneratedLibrary.so .app/src/main/libs/armeabi/libMyGeneratedLibrary.so 文件位于:

obj

我希望在不同的位置生成输出:

  1. .app/src/main/obj/local/armeabi-v7a/libMyGeneratedLibrary.so .app/src/main/obj/local/armeabi/libMyGeneratedLibrary.so libs。 即。 jniLibs
  2. 其中一个构建文件夹下的./app/src/main/jniLibs/armeabi*。即。 obj [1]或build [2]。
  3. 有没有办法通过将某些参数更改为build文件或构建命令来实现这一目的?

    修改

    .mk似乎不适用于NDK r6b

    执行命令TARGET_OUT

    警告,因为每个生成的文件都会显示以下内容。

    ndk-build -C Android/app/src/main/ TARGET_OUT='Android/app/src/main/jniLibs/$(TARGET_ARCH_ABI)'

5 个答案:

答案 0 :(得分:31)

您可以使用NDK_LIBS_OUT更改libs输出,使用NDK_OUT更改obj输出。 就像这样:ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj

答案 1 :(得分:5)

如果您需要构建所有可用的体系结构,请使用参数:

public enum ActiveStateGreenRed {
    INACTIVE(false, STATE_COLOR.RED), //the only difference between enums
    ACTIVE(true, STATE_COLOR.GREEN);

    private final Boolean value;
    private final STATE_COLOR color;

    private ActiveStateGreenRed(Boolean value, STATE_COLOR color) {
        this.value = value;
        this.color = color;
    }

    public Boolean toValue() {
        return value;
    }

    public STATE_COLOR toColor() {
        return color;
    }
}

如果只有一个目标架构就足够了,那么使用参数:

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

答案 2 :(得分:1)

我如何解决它。不是很优雅,但至少它有效。

因为我的构建机制非常复杂,所以我也有一些自定义的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,所以我把它保留原样。

答案 3 :(得分:0)

指定输出位置的更好,更简单的方法是链接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并完成构建。

答案 4 :(得分:0)

最简单的方法是 linking Android.mk 文件到 Gradle,如下所示:

android {
    ...
    externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }
}

然后只需点击立即同步并构建项目