[Android]关于Native函数的debug

先占坑,有空发。

环境: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文件在此时会被加载。



转载于:https://my.oschina.net/u/1429862/blog/226217

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值