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

新建项目

new-Android Application Project,输入名字,比如NdkTest,然后一直点下一步完成即可,如果不需要调试c++,只调试java,现在就可以项目右键,Debug as-Android Application就可以在真机上调试了,推荐用真机调试,再差的真机,也比虚拟机强很多倍,而且虚拟机很占硬盘空间

c++调试

项目右键-Android Tools-Add Native Support,使用默认名字点确定即可,这样项目右键-Properties即可看到多了两项:C/C++Build和C/C++ General。

C/C++ Build选项卡,选择Builder Settings,取消勾选Use default build command,下面输入ndk-build NDK-DEBUG=1

在windows上,这样就可以了,但是我试了linux不行,需要在AndroidManifest.xml的application选项卡中添加android:debuggable="true"

添加待调试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");}@Overrideprotected 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电脑不行

捕捉最后的流星,坐在最高的山顶上,可以听音乐,聊电影,

Android+NDK+Eclipse调试

相关文章:

你感兴趣的文章:

标签云: