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电脑不行