先占坑,有空发。
环境: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文件在此时会被加载。
来源:oschina
链接:https://my.oschina.net/u/1429862/blog/226217