Android 更改ndk生成输出位置

Android 更改ndk生成输出位置,android,android-gradle-plugin,ndk-build,Android,Android Gradle Plugin,Ndk Build,我的应用程序具有以下结构 Android | |-> app | | | |-> build [1] | |-> src | | |-> main | | | |-> assets | | | |-> java | | | |-> jni | | | | |-> Android.mk | | | | |

我的应用程序具有以下结构

Android
|
|-> app
|    |
|    |-> build [1]
|    |-> src
|    |    |-> main
|    |    |     |-> assets
|    |    |     |-> java
|    |    |     |-> jni 
|    |    |     |     |-> Android.mk
|    |    |     |     |-> Application.mk
|    |    |     |
|    |    |     |-> jniLibs
|    |    |     |      |-> armeabi
|    |    |     |      |-> armeabi-v7a
|    |    |     |
|    |    |     |-> res
|    |    |     |-> AndroidManifest.xml
|
|-> build [2]
我正在linux机器上使用
ndk build
命令构建我的
.so
库。我使用它的方式如下:

<my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
obj
文件位于:

.app/src/main/obj/local/armeabi-v7a/libMyGeneratedLibrary.so
.app/src/main/obj/local/armeabi/libMyGeneratedLibrary.so
我希望在不同的地点制作输出:

  • jniLibs
    处的
    libs
    。 例如,
    /app/src/main/jniLibs/armeabi*
  • 其中一个生成文件夹下的
    obj
    。即
    构建
    [1]或
    构建
    [2]
  • 有没有可能通过将某些参数更改为
    .mk
    文件或build命令来实现这一点


    编辑

    TARGET\u OUT
    在NDK r6b中似乎不起作用

    执行命令
    ndk build-C Android/app/src/main/TARGET\u OUT='Android/app/src/main/jniLibs/$(TARGET\u ARCH\u 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'
    

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

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

        TARGET_OUT='<your_build_dir>/$(TARGET_ARCH_ABI)'
    
        TARGET_OUT=<your_build_dir>
    
    TARGET\u OUT='/$(TARGET\u ARCH\u ABI)'
    
    如果只有一个目标架构就足够了,那么使用参数:

        TARGET_OUT='<your_build_dir>/$(TARGET_ARCH_ABI)'
    
        TARGET_OUT=<your_build_dir>
    
    TARGET\u OUT=
    
    编辑(适用于使用较新NDK版本的人):

    • 使用
      NDK_LIBS_OUT
      更改LIBS输出(需要NDK r9及以上版本)
    • 使用
      NDK\U OUT
      更改obj输出(需要NDK r7c及以上)
    生成命令为:

    ndk-build NDK_LIBS_OUT=./jniLibs NDK_OUT=./obj
    

    之前的答案(适用于任何情况):

    我如何解决它。不是很优雅,但至少它能工作

    因为我的构建机制非常复杂,所以我也有一些定制的gradle任务和脚本,构建的单个命令对我来说并不重要

    所以我保持了构建命令的原样

    <my_ndk_path>/ndk-build -C <my_project_path>/Android/app/src/main/
    
    /ndk build-C/Android/app/src/main/
    
    在文件夹创建过程中添加一个(-p如果存在,则不生成错误)

    mkdir-p/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/
    
    rsync-avh——删除源文件\
    /Android/app/src/main/libs/*\
    /Android/app/src/main/jniLibs/
    

    您可以对
    obj
    文件夹执行类似操作。我刚刚修改了.gitignore,所以我保留了它的原样。

    指定输出位置的更好、更简单的方法是链接。 之后,使用
    ndkBuild
    块中的
    buildstagindirectory
    选项指定输出位置:

    android {
        externalNativeBuild {
            ndkBuild {
                // Tells Gradle to put outputs from external native
                // builds in the path specified below.
                buildStagingDirectory  "src/main/libs"
            }
        }
    }
    
    然后同步Gradle并构建,完成。

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

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

    然后点击立即同步,然后构建项目

    这对我来说真的不起作用。看起来NDK忽略了这些。也许这是后来版本的一部分,因为我有一个相当旧的r6b版本。
    NDK_OUT
    是在第7c版中添加的
    NDK_LIBS_OUT
    在第9版中添加。在Android.mk或Application.mk中,应该在哪里添加NDK_LIBS_OUT?NDK_LIBS_OUT应该添加为NDK build call的一个参数。那么如何向NDK build call添加一个参数呢?Gradle 3.2.1一直告诉我,
    参数
    无效。这对我也不起作用,因为我需要的
    $(TARGET\u ARCH\u ABI)
    没有任何效果,库是在jniLibs文件夹中生成的,而不是在
    armeabi
    中生成的,
    armeabi-v7a
    使用上述参数时,您是否可以复制并粘贴您的确切命令行?我很好奇,因为我在几个小时前成功地使用了它。另外,你的NDK版本是什么?遗憾的是,它是一个非常旧的r6b版本。我尝试了许多不同的方法,还尝试将
    TARGET\u OUT:=…
    添加到
    应用程序.mk
    中,当它通过且未失败时,我会收到我添加到原始帖子中的警告。指定外部本机生成输出目录的路径,以替换默认的
    /.cxx/
    。我同意上面的官方解释可能令人困惑,但是这个目录包含中间构建文件(日志、对象等)。
    .so
    文件通常进入
    /build
    目录。请参阅。两个
    cmake
    ndkBuild
    部分似乎都允许
    buildStagingDirectory
    选项,谢谢!