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.我的本机项目具有以下(简化)结构:
本地人
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)Application.mk
APP_ABI := all
APP_PLATFORM := android-21
Run Code Online (Sandbox Code Playgroud)my_tool
如何在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.
我试图尽可能地遵循你的简化结构。
这是文件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 升级中中断。
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |