使用NDK 13编译独立二进制文件

jus*_*.me 6 android native android-ndk android-studio ndk-build

使用NDK 10版本,我曾经用于ndk-build编译许多不同ABI和多个API级别的独立二进制文件.这些二进制文件将包含在一个应用程序中.但是,我在本文所述的新开发机器上安装了NDK .这导致ndk-bundle我的Android SDK目录中有一个文件夹.我曾经从命令行编译代码,然后将二进制文件复制到我的Android Studio项目的资源中,但我无法弄清楚如何使用NDK 13这样做,所以我尝试按照教程包含我的本机代码Android Studio项目.但是,几乎所有最近的指令都假设一个人想要构建一个库,而不是一个独立的二进制文件,所以我没有走得太远.

如果我弄清楚如何让它工作,我会切换到CMake.我的本机项目具有以下(简化)结构:

如何在Windows 10开发机器上使用Android Studio或NDK从命令行编译?

编辑:

我在build.gradle中使用它:

externalNativeBuild {
    ndkBuild {
        path "../native/Android.mk"
    }
}
Run Code Online (Sandbox Code Playgroud)

Gradle创建了一个.externalNativeBuild包含构建配置的目录,但我无法找到如何实际构建本机代码.运行gradle时不会创建二进制文件.

我找不到有关gradle配置的任何信息ndk-build.

Ale*_*ohn 5

我试图尽可能地遵循你的简化结构。

这是文件app/build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.1"
    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 24
        externalNativeBuild {
            ndkBuild {
                targets "my_tool"
                abiFilters "armeabi-v7a"
            }
        }
    }
    externalNativeBuild {
        ndkBuild {
            path "../native/Android.mk"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

文件native/Android.mk与您的相同:

LOCAL_PATH := $(call my-dir)/my_tool/src
include $(CLEAR_VARS)
LOCAL_MODULE    := my_tool
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)

我也有文件native/main.c和一个最小的app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="my.tool" />
Run Code Online (Sandbox Code Playgroud)

我没有触及Android Studio 向导生成的root build.gradle脚本:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0-alpha3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)

现在我可以构建项目,这是我得到的:

$> file ./app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/my_tool
ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
Run Code Online (Sandbox Code Playgroud)

Android Studio在默认视图的cpp文件夹中显示我的main.c

在此处输入图片说明

更新:要将可执行文件剥离并打包到 APK 中,必须更改native/Android.mk

LOCAL_PATH := $(call my-dir)/my_tool/src

install: LIB_PATH := $(call my-dir)/libs

include $(CLEAR_VARS)
LOCAL_MODULE    := my_tool
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)

install: $(LOCAL_INSTALLED)
    -mkdir $(LIB_PATH)
    -rm -r $(LIB_PATH)
    mv $< $(<:my_tool=lib-my_tool-.so)
    mv $(realpath $(dir $<)..) $(LIB_PATH)

.PHONY: install
Run Code Online (Sandbox Code Playgroud)

此外,app/build.gradle需要一些调整:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.1"
    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 24
        externalNativeBuild {
            ndkBuild {
                targets "my_tool"
                abiFilters "armeabi-v7a"
                arguments 'V=1', 'install'
            }
        }
    }
    externalNativeBuild {
        ndkBuild {
            path "../native/Android.mk"
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['../native/libs']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这依赖于旧的 hack,它依赖于 NDK 的未记录行为,并且可能会在没有通知的情况下在未来的 NDK 升级中中断。