[Android]关于Native函数的debug

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-01 00:05:28

先占坑,有空发。

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



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!