在ndk{} DSL中定义LOCAL_SRC_FILES
define LOCAL_SRC_FILES in ndk{} DSL
我想知道是否可以在gradle中定义LOCAL_SRC_FILES。构建NDK{}块。
我正在使用:
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
在我的顶级gradle。构建文件。
我的jni模块gradle。构建文件如下所示:apply plugin: 'com.android.library'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 11
buildToolsVersion "22.0.1"
def jniSrc = System.getProperty("user.home") + "/srcs/jni"
defaultConfig {
ndk {
moduleName "core"
stl "gnustl_shared"
cFlags "-std=c++11"
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
jni.srcDirs = ["${jniSrc}"]
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
}
}
productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
arm {
ndk {
abiFilter "armeabi-v7a"
}
}
mips {
ndk {
abiFilter "mips"
}
}
}
}
我问的原因是在我的jni源码下有针对不同平台的代码,不仅仅是Android,还有iOS和WinRT。
我有点不愿意迁移到实验性的'com.android.tools.build:gradle-experimental:0.2.0',但如果前面提到的模块解决了问题,我可以尝试一下。
我也不喜欢使用:
jni.srcDirs = []
并覆盖Android的创建。因此,使用我自己的自定义的一个,因为我不确定我是否可以调试c++原生从Android Studio此后(我可能是错误的在这里虽然,我绝对不是Android Studio ndk插件的专家用户)。
提前感谢,
Manos)
使用实验性插件0.4.0,可以通过模式从NDK构建中排除文件,例如
android.sources {
main {
jni.source {
srcDirs = ["~/srcs/jni"]
exclude "**/win.cpp"
}
}
}
感谢Paul Spark!
注:(感谢rajveer):更改exclude
后不要错过Build/Clean
!
老回答
不幸的是,当前的gradle插件不支持这个。即使是"实验性的"插件也只允许添加目录。我建议保留传统的Android。mk可以可靠地完成这项工作。
我也建议不要设置jni.srcDirs = []
,而是保留${jniSrc}
,让Android Studio显示这些文件,以便于访问和语法突出显示。如果您正确设置 cppFlags
和 cFlags
,您也将拥有通过头交叉引用的全部功能。
技巧是禁用常规的NDK构建任务,并注入buildNative
任务:
def ndkBuild = android.ndkDirectory
import org.apache.tools.ant.taskdefs.condition.Os
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
ndkBuild += '.cmd'
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
commandLine '$ndkBuild', 'NDK_PROJECT_PATH="$jniSrc/..'
}
task cleanNative(type: Exec, description: 'Clean JNI object files') {
commandLine '$ndkBuild', 'clean', 'NDK_PROJECT_PATH="$jniSrc/..'
}
clean.dependsOn 'cleanNative'
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
tasks.all {
task -> if (task.name.contains('compileDebugNdk') || task.name.contains('compileReleaseNdk')) task.enabled = false
}
类似的方法适用于 'com.android.tools.build:gradle-experimental:0.2.0'
,但任务匹配不同:
tasks.all {
task ->
if (task.name.startsWith('compile') && task.name.contains('MainC')) {
task.enabled = false
}
if (task.name.startsWith('link')) {
task.enabled = false
}
if (task.name.endsWith("SharedLibrary") ) {
task.dependsOn buildNative
}
}
更新buildNative不产生可调试的设置。具体来说,当运行Android Native调试配置时,Android Studio抱怨它无法找到包含模块应用中带有符号的目标文件的文件夹。
我建议使用下面的解决方案,我只在本地源代码被分成(至少)两个目录的情况下进行了测试:android特定的文件(我将它们称为JNI bridge)在一个单独的目录中,其余的在其他地方。解决方法包括使用ndk-build构建一个静态库,并将其与最小对象集链接,这些对象集将从该库中提取所有必要的符号。
为简单起见,让我们假设android特定的文件(Application。可、 Android。mk和"android-jni.cpp"位于目录~/srcs/jni
中,而与平台无关的文件位于~/srcs
及其其他子目录中。
def LOCAL_MODULE = "staticLib"
def appAbi = "armeabi-v7a"
def ndkOut = "build/intermediates/$LOCAL_MODULE"
def staticLibPath = "$ndkOut/local/$appAbi/lib${LOCAL_MODULE}.a"
task buildStaticLib(type: Exec, description: 'Compile Static lib via NDK') {
commandLine "$ndkBuild", "$staticLibPath", "NDK_PROJECT_PATH=~/srcs", "NDK_OUT=$ndkOut", "APP_ABI=$appAbi", "APP_STL=gnustl_static"
}
tasks.all {
task ->
if (task.name.startsWith('link')) {
task.dependsOn buildStaticLib
}
}
model {
android.ndk {
moduleName = "hello-jni"
abiFilters += "$appAbi".toString()
ldFlags += "$staticLib".toString()
ldLibs += "log"
cppFlags += "-std=c++11"
}
android.sources {
main.jni.source {
srcDirs = ["~/srcs/jni"]
}
}
}
~/src/Android。mk文件可能看起来像这样:
LOCAL_PATH := $(call my-dir)/..
include $(CLEAR_VARS)
LOCAL_MODULE := staticLib
LOCAL_SRC_FILES := HelloJni.cpp
LOCAL_CPPFLAGS += -std=c++11
include $(BUILD_STATIC_LIBRARY)
对于Android中的 LOCAL_MODULE
非常重要。在build.gradle.中为使用LOCAL_MODULE
。
更新2
这仍然是可能的,感谢jforce,参见"链接单个原生源文件到Android Studio项目"!
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- "local scope"中的 C++ 初始化静态变量
- 在 /usr/local/lib 下找不到库
- C++:寻找"returning address of local variable..."的更正
- C++ - 在我尝试制作一个简单的计算器时有一个"uninitialized local variable y used"警告
- 错误:断言失败 (src.type() == CV_8UC1) 在阈值中
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- pip install uwsgi 失败,出现 /usr/local/include/string/string.h:7:10:致命错误:找不到'sstream'文件?
- 在发送源代码时省略未使用的boost src文件的策略
- 将 TensorFlow 链接到C++.Protobuf (/usr/local/include/google/prot
- 为什么我收到以下错误:"returning reference to temporary [-Werror=return-local-addr]"
- Visual Studio生成"Error: uninitialized local variable 'x' "而在线编译器不会 - 为什么?
- 为简单的src,include,libs文件夹项目编写Makefile
- AppData\Local\Temp\cc59LXDc.o:test1.cpp: undefined reference to 'constructNewObjectOfClass
- Boost 文件在 /usr/local/include 和 /usr/include 中有所不同
- 此示例中的'aliased local shared_ptr'是什么
- 带有定制 GLFW 二进制 /usr/bin/ld 的 Centos 7: /usr/local/lib/libglfw3.a(init.c.o):".text"部分中无法识别的重定位 (0x2a)
- src/caffe/parallel.cpp:70:1:错误:“参数”未命名类型
- 在 Ubuntu 16.04 的 usr/local/bin 中安装的 c++ 应用程序在从主目录执行时无法正常运行
- QT:在".pro" ffly中指定项目目录,如"build"和"src"