AndroidStudio NDK使用传统make文件进行调试

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

根据链接见子标题“usingandroid.mk/Application.mk”,文章声称可以使用androidstudio进行编辑和调试。我已经按照那篇文章中的所有说明进行了操作,但是调试器似乎从未达到断点。这对谁有用吗

更多信息

我的设置

  • Android Studio 1.4
  • 梯度2.6
  • Android Gradle插件0.3.0-alpha5
  • 我的身材,格雷德尔看起来像这样

    应用插件:“com.android.model.application”

    模型{ 安卓{ compileSdkVersion=21 buildToolsVersion=“23.0.0 rc2”

    }

  • 我的本机源在app/src/jni中的源之间分割,并且位于FS的不同位置(因为有些源是第三方的)

  • 代码完成工作良好(我能够在第三方源代码中包含并使用源代码)
  • 我在外部使用Android.mk和Application.mk以及ndk构建所有本机源代码。SO文件在jniLibs下生成,应用程序运行良好

  • 当我在本机源中的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插件链接到共享库。