Android Studio 让JNI调试C/C++更加方便(通过lib调用native调试)

origin: http://blog.csdn.net/autumn_xl/article/details/62218546
搭配使用 Android Studio 2.2 或更高版本与 Android Plugin for Gradle 版本 2.2.0 或更高版本时,您可以将 C 和 C++ 代码编译到 Gradle 与 APK 一起封装的原生库中,将这类代码添加到您的应用中。也就是说我们可以在需要jni调用的项目中像调试java一样调试native层代码。

可能我们在日常工作中调试native层代码很痛苦,需要打log或者gdb。但是新版的Android Studio通过CMake进行构建,在调用到native的接口的时候可以直接按F7跳进去跟踪代码,是不是很方便?!

具体配置方式如下:
https://developer.android.com/studio/projects/add-native-code.html

可以根据cmake语法灵活的配置CMakeLists.txt,比如一个项目中生成多个so,并同时生成可执行文件等。

这篇文章我想记录的是工作中在使用这个新功能的时候发现并解决的一个问题。

有些比较大的项目可能我们会有些依赖的lib项目比如:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里写图片描述

这里写图片描述

app project 需要依赖demonlib project。而demonlib project中使用了:
这里写图片描述

官网中就这种情况并没有为我们提供。这里我为大家提供一个方法来解决这个问题。

第一步:
这里写图片描述

这个是工程的目录结构,注意CMakeLists.txt的路径

第二步:
这里写图片描述
注意cpp文件路径

第三步:
这里写图片描述

注意这是关键的一步,需要将app project的gradle 中添加如上内容。
这就是为什么在ide中会这样显示:
这里写图片描述

第四步:
这里写图片描述

通过这里进行验证我们的修改。shift+f9开始调试,在

String str = new helllll().stringFromJNI();
  • 1

设置断点,到这里后继续跳入f7,最后会发现真的进入到c代码处了。

#include <jni.h>
#include <string>

extern "C"
jstring
Java_testservice_hidesd_com_test_myapplicatione_lib_helllll_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

总结:
找到这个方法也不是一帆风顺的,我开始是按照正常思维将CMakeLists.txt 还有 gradle中的配置参数都放在lib project中的。因为调用的是lib,c代码又在lib中这么想很合理,但是发现根本行不通,走到断点的地方就进不去了,调试只能停留在java这层。于是开始用排除法找问题,先是想是不是我配置文件写错了,新建一个简单的demo(通过正常新建一步步点击勾选生成的)工程发现没有错。又上网找资料 答案 问同事,都无果很多人还不知道新版android studio有这个功能。于是对着demo工程思考,想问题出在哪里,在工程目录中搜索生成的so文件,无意间我发现我这个工程和demo工程的一个重大差别在于生成文件的路径!!!这是demo工程:

这里写图片描述
这里写图片描述

而我的工程中压根就没有cmake的目录,于是我决定修改CMakeLists.txt文件路径,并保证app project工程能使用到这个CMakeLists.txt于是我把这个文件放到项目根目录。将 Gradle 关联到原生库 仿照demo工程,将app的gradle中添加配置。神奇的事情发生了按照这个思路终于将我的问题解决了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值