因为要在旧版android在做一些工作。所以做用到了它。目标平台是:android api 10和armv6. 开发环境是:AS 版本2.3.2; SDK版配android 2.3.3(api10); NDK版本android-ndk-r10e这个必需,后面版本对armv6有点问题,我试的r13b就是gdbserv er不运行,好似这些版本从armv7开始了.  gradle的版本关系不大,我用的是4.7.

这些基本的开改环境安装好就开始配成开发JNI 本地代码的三种方法三有:直接用gradle的任务与NDK中的ndk-build和ndk-gbdl; 用Gradle_Experimental,这个也是用ndk-build,做了一些gradle的工具,但现在有更新的方法不建议用这个。 新工程用CMAKE与LLDB吧,LLDB因为没找到armv6的编译版本,我自已双不想去编译,LLDB是LLVM下的一个工具,其工程和android源码有点类似,要整体下了配置编译,只编译一部分,大约问题会太多,我就没去试。用gdb原生工具适应度宽一点。配本上是LINUX的地方都可用。

第一步,生成新工程,

在生成新工程时选择支持C++,别的基本不用动,这样配出来的基本上就是用CMAKE开发的环境。我生成新工程时,因为AS网上下东西就卡死了,我断网后,AS不下东西,就生成新工程通过了。然后手工在文件中改配。我生成的代码中带一个简单的C调用。就用它做配置测试。

先用CMAKE有的环境做了测试。基本上不用动就是编译通过的,如果出小问题网上找一下吧。因为每个人的开发环境可能不一样。这里先试一下CMAKE, Cmake在android-ndk-r10e下是不能用的。我用的是android-ndk-r13b,在armv6可运行,但因LLDB-server不运行,所以不能调试。

第二步,在gradle配置中去CMAKE, 配ndk-build。相关的文件是gradle.properties,这里加入

#for NDK-build

Android.useDeprecatedNdk=true

主要的改动在这里build.gradle(APP)这个是APP 目录下的。注释去CMAKE相关部分。

/*externalNativeBuild {

cmake {

cppFlags "-frtti -fexceptions"

}

}

ndk {

// Specifies the ABI configurations of your native

// libraries Gradle should build and package with your APK.

abiFilters 'armeabi'

}*/

/*externalNativeBuild {

cmake {

path "CMakeLists.txt"

}

}*/

整个文件出来吧

apply plugin: 'com.android.application'

android {

compileSdkVersion 25

buildToolsVersion "28.0.1"

defaultConfig {

applicationId "com.home.ququ.videotest"

minSdkVersion 9

targetSdkVersion 25

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

/*externalNativeBuild {

cmake {

cppFlags "-frtti -fexceptions"

}

}

ndk {

// Specifies the ABI configurations of your native

// libraries Gradle should build and package with your APK.

abiFilters 'armeabi'

}*/

//gradle test task

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

debug {

jniDebuggable true

debuggable true

}

//for NDK-build maked .so \Videotest\app\src\main\jniLibs

sourceSets {

main {

jni.srcDirs = []

//jniLibs.srcDirs = ['libs']

}

}

}

/*externalNativeBuild {

cmake {

path "CMakeLists.txt"

}

}*/

}

dependencies {

compile fileTree(include: ['*.jar'], dir: 'libs')

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

exclude group: 'com.android.support', module: 'support-annotations'

})

compile 'com.android.support:appcompat-v7:25.3.1'

compile 'com.android.support.constraint:constraint-layout:1.0.2'

testCompile 'junit:junit:4.12'

}

task hello {

println 'Hello world!'

}

//for NDK-build

task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {

commandLine 'D:\\android-ndk\\android-ndk-r10e\\ndk-build.cmd ',//这里本地ndk的路径

'NDK_DEBUG=1',

'NDK_PROJECT_PATH=D:\\androidproject\\Videotest\\app\\src\\main\\',

'NDK_LIBS_OUT=D:\\androidproject\\Videotest\\app\\src\\main\\jniLibs',

'APP_BUILD_SCRIPT=./src/main/jni/Android.mk',

'NDK_APPLICATION_MK=./src/main/jni/Application.mk'

}

//when build do it

preBuild.dependsOn ndkBuild

task hello是我写gralde任短务时做测试。命令行调用任务是在build.gradle同目录下,

D:\Android-Studio\gradle\gradle-4.7\bin\(gradle的安装目录)gradle hello

初次调用,要下一些东西,有点慢。再调用就快了。

ndk-build的编译工作主要是通过任务ndkbuild. 我是用命令行调好了才在这里改的。最后一行指示build在在编译前调用这个任务。

preBuild.dependsOn ndkBuild

任务也可以直接用gradle ndkbuild在terminal下调用。把gradle的安装目录windows的环境变量就要不用写路径了。因为写了编译前调用这个路戏不加了。只是把ndk-guild.cmd加入windows的环境变量。因为后面的GDB是命令操作方式。

这样编译,运行吧,我的环境下没问题。到目示平台上一切正常。电脑开不起仿直器,有点旧了,好卡。

忘了一点,要写.mk文件的。默认生成的CPP文件在CPP 目录下。ndk-guild默认找到是JNI目录。这个可配,我是重配到JNI目录了。这个目录下要加两个.mk文件,用于编译指示。(CMAKE用的CMAKELISTS.txt配方不同)

Application.mk

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions

APP_ABI :=armeabi

Android.mk

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=native-lib

LOCAL_SRC_FILES :=native-lib.cpp

LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog

include $(BUILD_SHARED_LIBRARY)

都是编译选项,有些是android 特有的。可以看一些关于mk的语法,如果只写一个库,就用这个无例子改一下名字就可。

可能遇到的错语,

1,run-as错误,这个有人说是修改一下NDK的脚本,其说法是有道理的,不过我一点点分析原因,是不调用是因为android的APP安装数据文件不对。我把它手机改对了,修改脚本可能也解决这个问题。修的是NDK-gdb的调试脚本,这个我没去试。直接改android的数据文件,指示run-as,调用时要找的数据项。

“我这里直接给DATA_DIR赋值为app目录:/data/data/com.umonistudio.tile。这步骤很重要,否则你会遇到run-as之类的错误,导致无法继续调试!”

2,app_process错语,这个把android的 /system/bin目录下的adb pull出一个到

(工程录)\app\src\main\obj\local\armeabi下就可以了。

4,ndk-gdb的调用脚本是我这个是旧版是PY写的。--verbose是打印执行命令的一些信息,方便找错。--nowait,让代码停在适当的位置。

ndk-gdb-py --verbose --start --nowait --adb D:\android-sdk\platform-tools\adb.exe

---------------------

作者:qqssbb123

来源:CSDN

原文:https://blog.csdn.net/qushaobo/article/details/81052680

版权声明:本文为博主原创文章,转载请附上博文链接!

androidstudio调试android 源码 jni,在android studio下配置gradle用ndk-build和ndk-gbd编译调试JNI...相关推荐

  1. Android源码 —— 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16)

    Android源码 -- 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16) 本文将介绍从Win7系统开始一步步构建下载Android源码的虚拟机环境: **1.使 ...

  2. android源码使用方法,android源码中使用到的设计模式(创建型)

    1.单例模式 1.1定义 确保某个类只有一个实例,而且自行实例化并向整个系统提供者个实例. 1.2单例的形式 饿汉模式:第一次就加载,用空间换时间. public class SingleTon { ...

  3. linux编译android源码,ubuntu16.04 Android源码下载编译

    本次编译源码的电脑为Ubuntu 16.04,4核 + 4G内存. 注. 对于电脑配置低的建议不要编译7.0以上的版本,就像我这台电脑,基本编译7.0以上都会报内存不足问题,因为在7.0版以上andr ...

  4. 【Android源码分析】Android系统关键服务启动简析

    一.关于Android系统重要的进程 (1).init进程:init进程是Linux内核启动完成之后,启动的第一个用户进程,Android系统就是在这个进程的基础上启动起来的,进程pid为1.init ...

  5. 途牛android源码,途牛,Android 开发工程师,一面,攒人品

    途牛,Android 开发工程师,一面 时间:33min 约的是微信视频 面试官态度非常好,比较年轻 很帅~~~ 昨天面的,没时间写,今天补上吧 首先:自我介绍 应用上线细节(说要搜我上线的应用) r ...

  6. Android源码开发笔记 -- Android数据库,屏幕休眠时间

    1. Android数据库问题(以下描述引用及参考http://blog.csdn.net/yin1031468524/article/details/71512996) 在Android7.0之后, ...

  7. Android 源码获取-----在Windows环境下通过Git得到Android源代码

    在学习Android的过程中,深入其源代码研究对我们来说是非常重要的,这里将介绍如何通过在Windows环境下使用Git来得到我们的Android源代码. 1.首先确保你电脑上安装了Git,这个通过  ...

  8. Android源码中com.android.support依赖迁移到AndroidX库

    <<返回总目录 文章目录 一.AndroidX 简介 二.迁移步骤 三.Gradle 四.常用依赖库对比 五.温馨提示: 一.AndroidX 简介 1.Google(谷歌) 2018 I ...

  9. 动手实现Android源码(AOSP)的下载、编译、运行、导入、调试

    这几天为了搞Android源码费了不少功夫,也遇到了不少坑,在此记录作为日后参考.Android源码的编译运行只支持Linux和Mac系统,至于Windows系统只能绕道了,或是在虚拟机上安装Linu ...

最新文章

  1. 心中无码,自然高清 | 联合去马赛克与超分辨率研究论文Pytorch复现
  2. VS Code 成主宰、Vue 备受热捧!2019 前端开发趋势必读
  3. Vivadoz中Block Memory Generator v8.3的使用方法(二)
  4. Android自定义Seekbar拖动条式样
  5. 背景颜色的不透明度,但不是文本[重复]
  6. 【转】理解IIS7的用户和组
  7. 作为JBoss AS 7模块运行Drools 5.4.0 Final
  8. linux 邮件开源工具_使用Linux和开源工具编写剧本
  9. 最全的Python进度条展示程序方案
  10. Just do IT --- gulp
  11. java 线程 condition_Java编程中实现Condition控制线程通信
  12. Kubernetes详解(十六)——Pod容器探测
  13. 黑客事件中如何实现利益最大化?
  14. 结构体赋值 -- 构造函数
  15. C语言存储误差,C语言实现测量数据误差处理
  16. 引入Google新技术 Picasa2发布
  17. 学习理论:理论联系实际--演绎归纳演绎
  18. 验证二叉树的前序序列化[抽象前序遍历]
  19. 正点原子阿波罗STM32F7-红外遥控原理及代码
  20. matplotlib 绘制直方图

热门文章

  1. python 第三方包自动导入_7行代码,彻底告别python第三方包import导入问题!
  2. webpack 采坑(CleanWebpackPlugin 插件报错: CleanWebpackPlugin is not a constructor ;)
  3. ajax查找错误信息
  4. 《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用
  5. 一次完整的HTTP请求所经历的7个步骤
  6. iPhone上将短信内容发送到指定邮箱的方法
  7. ActiveReport的小数显示方法
  8. QQ“远程协助”文字输入技巧
  9. nginx模型概念和配置文件结构
  10. MFC基于TCP协议的CSocket类套接字服务器端代码示范