文档章节

[Android]关于Native函数的debug

o
 ouczxl
发布于 2014/04/24 16:53
字数 719
阅读 1496
收藏 7

先占坑,有空发。

环境:WIN7 + eclipse + android sdk4.3 + ndk r9b

需求:安卓程序通过jni调用C代码,并对C代码进行debug。

纠结:1、使用真机,直接无法启动

          2、使用模拟器,能够启动,但是无法进入debug

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

        由于新版本的ndk对native代码的debug功能支持的已经比较完善,环境搭建已经比较简单了,依稀记得之前为了搭建能够debug native代码的环境,愣是花了接近一个周的时间,各种试,各种不对,各种纠结囧。

        1、在eclipse下配置正确的sdk以及ndk路径(我直接在google下载配置好的eclipse:adt-bundle-windows-x86_64)

        2、新建android工程,右键工程->Android Tools->Add Native Support,eclipse自动创建jni文件夹,并且有一个cpp文件(如HelloJni.cpp)和Android.mk文件

        3、写一个测试类TestClass

public class TestClass {
	
	public String getStr() {
		String s = getStrFromNative();
		return s;
	}
	
	static {
		System.loadLibrary("HelloJni"); //加载so
	}
	
	public native String getStrFromNative(); //声明Native函数
}

            4、在HelloJni.cpp中写Native函数(假设TestClass所属的包名为com.a.b)

JNIEXPORT jstring JNICALL Java_com_a_b_TestClass_getStrFromNative
  (JNIEnv *env, jobject obj)   
{
	const char* pBuf = "hello jni";
	return env->NewStringUTF(pBuf);
}

            5、到这就可以编译运行了,但是为了能够debug,还需要进行下面的操作。

            6、右键工程->Properties->C/C++ Build->右侧页面Builder Settings标签->取消Use Default build command前面的√,在Build command中输入ndk-build NDK_DEBUG=1

            7、工程已经配置完了,按理说已经能够编译然后debug了,右键工程->Debug as->Android Native Application,但是下面出现了纠结我一天的事情……


    我使用真机调试,结果程序根本无法启动,eclipse输出很多红色字体错误,这个应该是手机系统版本与sdk以及ndk不匹配导致,但是我一直认为是自己工程出了问题,一遍又一遍的尝试,最后放弃了。

    当我意识到版本不匹配之后,我改用模拟器,这个总不会版本不匹配吧。果然,程序启动起来了,结果问题又出现了,eclipse直接输出No symbol table is loaded.  Use the "file" command。然后我又尝试了一遍又一遍,伴随着其中的google。最终我发现了一遍博客(android NDK开发、编译、调试环境搭建与操作入门)拯救了我,我根据该文中的方法终于在模拟器上成功进行了debug。造成这个问题的原因在博文中也有提到,当ndk gdb启动安卓程序时,需要debug的so并没有加载,于是gdb会输出No symbol table is loaded。解决方法就是在程序启动时直接加载so文件,我是在onCreate函数中直接new TestClass,于是TestClass中的static代码段会被调用,so文件在此时会被加载。



© 著作权归作者所有

o
粉丝 1
博文 14
码字总数 2768
作品 0
沈阳
私信 提问
零基础用react-native开发android app

https://segmentfault.com/a/1190000003915315 序 基于雨点儿网,分享react-native开发android app的方法。 这篇博客旨在帮没有任何android或者ios开发经验的开发者体验一把当下热门的react...

james_laughing
2018/09/19
37
0
为啥那么多人喜欢直接拿NDK sample里面android_native_app_glue.h用

RT,十分不解,很多纯ndk的android应用都喜欢直接用NDK sample代码里面的android_native_app_glue.h android_native_app_glue.c直接做应用开发,就那么几行代码至于么? 为啥没人用native_ac...

cut
2014/08/08
3.7K
2
React Native 调试问题

使用React Native Tool在VSCODE中进行断点调试时点击DEBUG Android,弹出 Could not debug. Unknown error: not all success patterns were matched. It means that "react-native run-andro......

bill1987610
2018/05/31
0
0
React Native 调试问题

使用React Native Tool在VSCODE中进行断点调试时点击DEBUG Android,弹出 Could not debug. Unknown error: not all success patterns were matched. It means that "react-native run-andro......

bill1987610
2018/05/31
1K
1
Android安全防护之旅---Android应用"反调试"操作的几种方案解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangwei0910410003/article/details/65935044 一、前言 在之前介绍了很多破解相关的文章,在这个过程中我们难...

尼古拉斯_赵四
2017/04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部