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");  
    }  
  
    @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电脑不行








郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。