AndroidStudio NDK使用传统make文件进行调试
根据链接见子标题“usingandroid.mk/Application.mk”,文章声称可以使用androidstudio进行编辑和调试。我已经按照那篇文章中的所有说明进行了操作,但是调试器似乎从未达到断点。这对谁有用吗 更多信息 我的设置AndroidStudio NDK使用传统make文件进行调试,android,debugging,android-studio,android-ndk,android-gradle-plugin,Android,Debugging,Android Studio,Android Ndk,Android Gradle Plugin,根据链接见子标题“usingandroid.mk/Application.mk”,文章声称可以使用androidstudio进行编辑和调试。我已经按照那篇文章中的所有说明进行了操作,但是调试器似乎从未达到断点。这对谁有用吗 更多信息 我的设置 Android Studio 1.4 梯度2.6 Android Gradle插件0.3.0-alpha5 我的身材,格雷德尔看起来像这样 应用插件:“com.android.model.application” 模型{ 安卓{ compileSdkVer
当我在本机源中的app/src/jni或第三方源位置下设置断点时,调试器不会命中它们。使用传统makefile编译时,会生成如下结构:
-obj
-local
-armeabi-v7a
-obj-debub
xxx.o
xxx.d
zzz.o
zzz.d
hello-jni.so
使用Android Studio调试的诀窍是jniLibs块的配置。必须如下所示:main.jniLibs {
source {
// srcDirs = ['src/main/libs']
srcDirs = ['src/main/obj/local']
}
}
为了不存疑,我的渐变看起来像这样。 import org.apache.tools.ant.taskdefs.condition.Os
plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.0"
defaultConfig.with {
applicationId = "com.example.hellojni"
minSdkVersion.apiLevel = 4
targetSdkVersion.apiLevel = 23
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
}
compileOptions.with {
sourceCompatibility=JavaVersion.VERSION_1_7
targetCompatibility=JavaVersion.VERSION_1_7
}
android.ndk {
moduleName = "hello-jni"
stl = 'gnustl_shared'
}
android.sources {
main.jni {
source {// srcDirs = ['src/main/jni/']
srcDirs = ['src/main/jni/none']
}
}
main.jniLibs {
source {// srcDirs = ['src/main/libs']
srcDirs = ['src/main/obj/local']
}
}
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file('proguard-rules.txt')
}
}
}
String getNdkDir() {
if (System.env.ANDROID_NDK_ROOT != null)
return System.env.ANDROID_NDK_ROOT
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataI
putStream())
String ndkdir = properties.getProperty('ndk.dir', null)
if (ndkdir == null)
throw new GradleException("NDK location not found. Define
ocation with ndk.dir in the local.properties file or with an
NDROID_NDK_ROOT environment variable.")
return ndkdir
}
String getNdkBuildCmd() {
String ndkbuild = getNdkDir() + "/ndk-build"
if (Os.isFamily(Os.FAMILY_WINDOWS))
ndkbuild += ".cmd"
return ndkbuild
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
commandLine getNdkBuildCmd(),
'-C', file('src/main/').absolutePath, // Change src/main/jni the relative path to your jni source
'-j', Runtime.runtime.availableProcessors()
// 'NDK_DEBUG=1'
}
我的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/Application.mk
LOCAL_MODULE := hello-jni
LOCAL_PATH := $(call my-dir)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/
LOCAL_LDLIBS := -llog \
-landroid \
LOCAL_SRC_FILES := bmain.c \
hello-jni.c
LOCAL_CPPFLAGS += -std=c++11
include $(BUILD_SHARED_LIBRARY)
My Application.mk文件:
APP_OPTIM := debug
APP_ABI := armeabi-v7a
APP_PLATFORM := android-10
APP_STL := gnustl_static
使用传统makefile编译时,会生成如下结构:
-obj
-local
-armeabi-v7a
-obj-debub
xxx.o
xxx.d
zzz.o
zzz.d
hello-jni.so
使用Android Studio调试的诀窍是jniLibs块的配置。必须如下所示:main.jniLibs {
source {
// srcDirs = ['src/main/libs']
srcDirs = ['src/main/obj/local']
}
}
为了不存疑,我的渐变看起来像这样。 import org.apache.tools.ant.taskdefs.condition.Os
plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.0"
defaultConfig.with {
applicationId = "com.example.hellojni"
minSdkVersion.apiLevel = 4
targetSdkVersion.apiLevel = 23
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
}
compileOptions.with {
sourceCompatibility=JavaVersion.VERSION_1_7
targetCompatibility=JavaVersion.VERSION_1_7
}
android.ndk {
moduleName = "hello-jni"
stl = 'gnustl_shared'
}
android.sources {
main.jni {
source {// srcDirs = ['src/main/jni/']
srcDirs = ['src/main/jni/none']
}
}
main.jniLibs {
source {// srcDirs = ['src/main/libs']
srcDirs = ['src/main/obj/local']
}
}
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file('proguard-rules.txt')
}
}
}
String getNdkDir() {
if (System.env.ANDROID_NDK_ROOT != null)
return System.env.ANDROID_NDK_ROOT
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataI
putStream())
String ndkdir = properties.getProperty('ndk.dir', null)
if (ndkdir == null)
throw new GradleException("NDK location not found. Define
ocation with ndk.dir in the local.properties file or with an
NDROID_NDK_ROOT environment variable.")
return ndkdir
}
String getNdkBuildCmd() {
String ndkbuild = getNdkDir() + "/ndk-build"
if (Os.isFamily(Os.FAMILY_WINDOWS))
ndkbuild += ".cmd"
return ndkbuild
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
commandLine getNdkBuildCmd(),
'-C', file('src/main/').absolutePath, // Change src/main/jni the relative path to your jni source
'-j', Runtime.runtime.availableProcessors()
// 'NDK_DEBUG=1'
}
我的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/Application.mk
LOCAL_MODULE := hello-jni
LOCAL_PATH := $(call my-dir)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/
LOCAL_LDLIBS := -llog \
-landroid \
LOCAL_SRC_FILES := bmain.c \
hello-jni.c
LOCAL_CPPFLAGS += -std=c++11
include $(BUILD_SHARED_LIBRARY)
My Application.mk文件:
APP_OPTIM := debug
APP_ABI := armeabi-v7a
APP_PLATFORM := android-10
APP_STL := gnustl_static
Check.TL;NR:使用ndk build
将代码构建为静态库,使用gradle插件链接到共享库。Check.TL;NR:使用ndk build
将代码构建为静态库,使用gradle插件链接到共享库。