【发布时间】:2017-01-23 21:40:05
【问题描述】:
我试图让 Android Studio 成为我的主要开发 IDE,用于 java 和 c/c++ 代码。我希望能够调试本机代码。
在这种情况下,我尝试将 ARToolkit5 用作库。
由于 ARToolkit5 中的一些示例,我拥有此构建文件。
我有这个Android.mk 文件
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
# Pull ARToolKit into the build
include $(CLEAR_VARS)
ARTOOLKIT_DIR := $(MY_LOCAL_PATH)/../../../../../artoolkit5/android
ARTOOLKIT_LIBDIR := $(call host-path, $(ARTOOLKIT_DIR)/obj/local/$(TARGET_ARCH_ABI))
define add_artoolkit_module
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
LOCAL_SRC_FILES:=lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
ARTOOLKIT_LIBS := ar2 kpm util eden argsub_es armulti ar aricp jpeg arvideo
LOCAL_PATH := $(ARTOOLKIT_LIBDIR)
$(foreach module,$(ARTOOLKIT_LIBS),$(eval $(call add_artoolkit_module,$(module))))
LOCAL_PATH := $(MY_LOCAL_PATH)
# Android arvideo depends on CURL.
CURL_DIR := $(ARTOOLKIT_DIR)/jni/curl
CURL_LIBDIR := $(call host-path, $(CURL_DIR)/libs/$(TARGET_ARCH_ABI))
define add_curl_module
include $(CLEAR_VARS)
LOCAL_MODULE:=$1
#LOCAL_SRC_FILES:=lib$1.so
#include $(PREBUILT_SHARED_LIBRARY)
LOCAL_SRC_FILES:=lib$1.a
include $(PREBUILT_STATIC_LIBRARY)
endef
#CURL_LIBS := curl ssl crypto
CURL_LIBS := curl
LOCAL_PATH := $(CURL_LIBDIR)
$(foreach module,$(CURL_LIBS),$(eval $(call add_curl_module,$(module))))
LOCAL_PATH := $(MY_LOCAL_PATH)
include $(CLEAR_VARS)
# ARToolKit libs use lots of floating point, so don't compile in thumb mode.
LOCAL_ARM_MODE := arm
LOCAL_PATH := $(MY_LOCAL_PATH)
LOCAL_MODULE := ndkDebugModule
LOCAL_SRC_FILES := nftSimple.cpp ARMarkerNFT.c trackingSub.c
# Make sure DEBUG is defined for debug builds. (NDK already defines NDEBUG for release builds.)
ifeq ($(APP_OPTIM),debug)
LOCAL_CPPFLAGS += -DDEBUG
endif
LOCAL_C_INCLUDES += $(ARTOOLKIT_DIR)/../include/android $(ARTOOLKIT_DIR)/../include
LOCAL_LDLIBS += -llog -lGLESv1_CM -lz
LOCAL_WHOLE_STATIC_LIBRARIES += ar
LOCAL_STATIC_LIBRARIES += ar2 kpm util eden argsub_es armulti aricp jpeg arvideo cpufeatures
#LOCAL_SHARED_LIBRARIES += $(CURL_LIBS)
LOCAL_STATIC_LIBRARIES += $(CURL_LIBS)
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/cpufeatures)
此版本运行正常。现在我正在尝试将其转换为 android 实验性 gradle 文件以便能够对其进行调试。好吧,现在我处于这种状态:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.3"
defaultConfig.with {
applicationId = "com.nomad5.ndkdebug"
minSdkVersion.apiLevel = 16
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "0.1"
}
}
/*
* native build settings
*/
android.ndk {
moduleName = "ndkDebugModule"
cppFlags.add("-I./../../../../../artoolkit5/include/ ")
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.txt'))
}
debug {
debuggable = true
ndk.with {
debuggable = true
}
}
}
}
/**
* The android native sources
*/
android.sources.main {
jni {
exportedHeaders {
srcDirs = [arRoot.absolutePath + "/include",
arRoot.absolutePath + "/android/jni/curl/include"]
}
source {
/* we set this to NOT automatically compile everything */
srcDirs = ["src/main"]
include "jni/nativeCodeA.cpp"
include "jni/nativeCodeB.cpp"
}
dependencies {
library "lib_ar2" linkage "static"
library "lib_kpm" linkage "static"
library "lib_util" linkage "static"
library "lib_eden" linkage "static"
library "lib_argsub_es" linkage "static"
library "lib_armulti" linkage "static"
library "lib_ar" linkage "static"
library "lib_aricp" linkage "static"
library "lib_jpeg" linkage "static"
library "lib_arvideo" linkage "static"
library "lib_cpufeatures" linkage "static"
library "lib_curl" linkage "static"
}
}
jniLibs {
source {
srcDirs = [arRoot.absolutePath + "/include",
arRoot.absolutePath + "/android/jni/curl/include"]
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile project(':aRBaseLib')
compile 'com.android.support:appcompat-v7:23.4.0'
}
gradle ndk 构建的问题是,在我的文件中(例如nativeCodeA.cpp)中所有包含在../../../../../artoolkit5/android 中的都找不到。所以所有的
#include <AR/ar.h>
#include <AR/arMulti.h>
#include <AR/video.h>
...
没有找到。
如何像LOCAL_C_INCLUDES 在makefile 中那样将文件夹添加到支持gradle 的ndk 构建中。以及如何在 makefile 中指定要编译的特定文件,例如 LOCAL_SRC_FILES。(即使没有明确指定文件,gradle 是如何知道这些文件的?)
顺便说一下我使用的方式
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
与
'com.android.tools.build:gradle-experimental:0.4.0'
【问题讨论】:
-
只是猜测,但项目工作目录可能因不同的构建系统而异。要检查这一点,请将您的相对包含路径更改为绝对路径。如果可行,请尝试修改相对路径中
../s 的数量。 -
好吧,正如您在 cmets 中看到的,我也尝试过使用绝对路径
-
你是如何最终在 gradle-experimental 中设置 NDEBUG 的?
-
我已经启动并运行了,请参阅下面的答案。有什么不明白的欢迎追问
标签: android debugging gradle android-ndk artoolkit