Android+NDK+Eclipse调试
Android调试c++会碰到一些问题,不是很容易,整理下以便以后查看
综述:
mac系统和linux系统调试相对比较容易,windows需要安装cygwin,虽然ndk-r9d文档说又NDK-GDB.PY可以用,但是我没有研究明白是否不需要cygwin
我在windows和linux上配置成功,但是windows不能单步调试,不知道什么缘故,linux可以
步骤:
安装(其实就是下载)NDK和ADT
android-ndk-r9d-windows-x86.zip
adt-bundle-windows-x86.zip
根据是windows系统还是linux系统,32位还是64位,选择windows/linux,x86/x86_64,这个一定要注意,否则后面会有各种奇怪问题
下载的adt-bundle其实是一个包含了adt和cdt的eclipse版本,所以不需要再下载相关插件,如果下载的是一个干净的eclipse,需要下载adt和cdt
网上有人说直接用adt-bundle有问题,下载干净eclipse再下载插件即可,我没碰到这个问题
配置系统
配置各种环境变量,包括java的和android的,环境变量没有配置或配置错误可以根据后面出现的错误提示配置,主要包括
JAVA_HOME CLASSPATH
ANDROID_ROOT ANDROID_SDK_ROOT NDK_ROOT
eclipse配置:windows-Preferences-Android-NDK,设置NDK Location
新建项目
c++调试
添加待调试c++文件
c++调试是让java调用c++代码,c++代码生成一个动态库(*.so)来让java调用,因此需要添加接口文件,可以自己手写,也可以使用javah生成,javah生成方式很简单:
在src目录下执行javah com.example.NdkTest.MainActivity即可,网上其它攻略我这提示错误,只有这样好使,而且没法使用-o指定生成文件名,会提示错误,只需要修改下名字,修改成NdkTest.h,复制到jni目录即可,注意,生成过程要注意大小写,即使是windows系统,大小写错误会提示找不到
在java代码里面添加c调用:
MainActivity.java 里面修改如下:
public class MainActivity extends Activity { native String ndkTest(); static { System.loadLibrary("NdkTest"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tView = new TextView(this); tView.setText( ndkTest() ); setContentView(tView); } // others don't have to change
测试代码添加:
public boolean onOptionsItemSelected(MenuItem item) { String a = ndkTest(); int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }这样,每次点击菜单就会调用c代码进行调试测试
下面是我在NdkTest.cpp里面的测试代码,随便写点东西测试即可
class a { public: a(); int b; int c; }; a::a() { b = 1; c = 3; } JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_ndkTest (JNIEnv *env, jobject obj) { a ca; ca.b = 2; ca.c = ca.b; return (*env).NewStringUTF("Just a test"); }
调试问题与解决
上面就是全部设置,但是往往会碰到一些问题,最常见的就是
APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidMainfest.xml,这个是由于编译使用的版本是14,而AndroidManifest.xml中设置的最小支持版本是8,如果在代码中用了8以后的接口,就会出问题,所以有这个提示,解决方法是将程序编译成版本8,在jni/Application.mk中添加APP_PLATFORM := android-8即可。如果没有这个文件就新建一个
有时候虽然设置了ndk-build NDK-DEBUG=1,但是生成项目的过程中没有出现:
gdbserver :[arm-linux-androideabi-4.6] libs/armeabi/gdbserver
gdbsetup :libs/armeabi/gdb.setup
这是由于没有编译成debug版本,虽然网上说生成debug版本设置ndk-build NDK-DEBUG=1或修改AndroidManifest.xml中android:debuggable="true"其中之一即可,但是如果后面那个不设置,我ubuntu电脑不行
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。