Android NDK学习--编译和调试(Ubuntu+Eclipse+NDK)

本文详细介绍了在Ubuntu环境下,使用Eclipse和NDK进行Android NDK开发的调试过程,包括环境搭建、代码编译和调试配置等步骤,帮助开发者解决混合调试中的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于NDK调试的文章,在网上能搜到几篇写得很好的。大概看了下,觉得应该不会太难。但真正能java和c混合调试,足足花了我一天的时间。一开始实在是太大意。整个过程下来,要求每一步都不能出错,不然就是折腾。所以我想站在别人的肩上,再把整个过程描述一下。本文的末尾或给出参考文章的链接。整个过程还是蛮复杂,不要烦躁哦,亲!

1.使用的软件版本

Ubuntu: 10.04
Eclipse: 4.3.0
NDK: r8

2.环境搭建

NDK的安装这里就不赘述,免得喧宾夺主了。只介绍下CDT和sequoyah两个插件的安装。

(1)安装CDT
给eclipse安装一个CDT,eclipse>help>install new software
下载地址为 http://download.eclipse.org/tools/cdt/releases/indigo/ (全部选上安装就行了)


(2)sequoyah
安装sequoyah 地址为 http://download.eclipse.org/sequoyah/updates/2.0/
只需要安装Sequoyah Android Native Code Support 一项就可以了


3.代码编译

到这一步,整个环境都搭好了。我们开始上主菜吧。
(1)如下导入NDK提供的例子HelloJni。如果导入错误,就先把错误解决了吧。


(2)把当前项目转为C++项目,File->new->other,如下选择 Convert to a C/C++ Project...
如下图,进行设置



PS:会出现找不到头文件jni.h的错误
解决方法:
Project Properties -> C/C++ General -> Path and Symbols
选择include标签,Add -> $Android_NDK_HOME/platforms/android-14/arch-arm/usr/include
且选中All languages.
最后Apply -> OK

(3)进行编译配置,把build command设置为ndk下ndk-build的完整路径(我已经把NDK的路径加到PATH中,所以不需要加路径,下面用到NDK的命令我都没加命令)
Project->Properties


将Behavior选项页下的build处的all替换为空格


(4)现在可以编译JNI代码,直接执行Build Project



4.代码调试

编译完成后,接下来我们看看怎么调试。

(1)首先,在NDK目录下找到ndk-gdb,把ndk-gdb最后一行注释掉



然后,进入到工程目录,执行命令ndk-gdb



出错了,设备或模拟器上安装的版本不是可调试的,需要重新安装可调式版本

解决方法:

首先确认我们现在的版本是不是可调试版本,如下打开文件AndroidManifest.xml,查看选项Debuggable是否为true,不是的话选为true,保存,再重新编译,并安装到设备或模拟器就解决问题了。


(2)再次执行ndk-gdb,没任何打印说明执行成功,另外你会发现obj文件下多了一些文件



(3)开始调试配置


如下图,右击C/C++ Application,选择new



这是一个独立的配置项,所以名字主要不跟Android Application下的配置项一样就行了。接下来按下图进行配置


其中文件app_process就是刚刚执行ndk-gdb生成的,Project的名字一定要一样,有时候点Browse没有任何选项的话,可以自己填进去,这个可能跟刷新有关,发现eclipse在ubuntu上刷新很慢。


接下来点击 Select other... ,按下图进行配置



上图确定后,点击Apply先保存Main选项的内容,然后切换到Debuuger选项,如下图进行配置

其中,

Stop on startup at:Java_com_example_hellojni_HelloJni_stringFromJNI(入口,意义不大,由断点决定)

GDB debugger:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gdb

GDB command file:/allwinner/android-ndk-r8e/samples/hello-jni/obj/local/armeabi/gdb2.setup

gdb.setup是和app_process同时生成。那gdb2.setup是怎么回事?复制gdb.setup,命名为gdb2.setup,并删除gdb2.setup文件中的最后一行“target remote :5039”。为什么用gdb2.setup不用gdb.setup呢?那是因为每次调试都会覆盖gdb.setup,不想每次都改,所以换名。就像有人不想每次介绍名字都给人笑,就改名那样,呵呵!


切换到Connection选项


(4)到这里配置就算完成了,接下来可以真正的开始调试了

a. 首先分别在java和jni代码中设置断点,我的如下




b.执行调试,注意Debug As 选择的选项是 Android Application,先运行项目的java调试。程序会再运行到第一个断点处停下来。


这时候赶紧运行在命令行下进入工程目录,然后运行ndk根目录下的ndk-gdb。运行之后是没有任何输出的。

c.找到刚刚配置的那个选项,点击Debug


如果之前每个步骤都正确的话,可以得到如下的画面:(debug模式下)



d.接下来进行单步调试,按F6。并不像我想的那样跳到jni代码那里去。一开始我以为那里弄错了,可是Console里gdb还在运行啊。后来找到Debug中,如下图对应的选项,发现其实已经跳到jni的断点处了,只是没有自动跳转。


到这里,NDK的编译和调试就算是被我们拿下了。


附:

错误1:
Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in 
./AndroidManifest.xml
解决方法:
android-ndk-r8c/build/core/add-application.mk第128行把__ndk_warning改为__ndk_info;

错误2:

Invalid attribute name: 
    package

解决方法:

我会出现这个错误的原因,是因为我的项目是从Windows拷贝到Ubuntu上的,当我用vim打开问题文件的时候,就一目了然了,因为字符编码不同导致的。


参考:

http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html

http://blog.youkuaiyun.com/dfqin/article/details/6901506





1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_LDLIBS := include $(BUILD_SHARED_LIBRARY) 2.) 在jni目录创建main.cpp #include using namespace std; #ifdef __cplusplus extern "C" { #endif class Test { public: Test(){}; ~Test(){}; int SomeFunc() { return 20140522; } }; jint Java_com_yxiaolv_testjni_MainActivity_SomeFunc(JNIEnv *env, jobject thiz) //红色部分必须你java类包名一致 { Test *test = new Test(); return test->SomeFunc(); } #ifdef __cplusplus } #endif //将下面第3.)至第5.)步的代码片段放到eclipse创建android项目时自动产生的MainAcitivity.java中就可以了 3.) 在Java Activity代码中添加对这个jni的调用 (本例中是MainActivity.java ): static { System.loadLibrary("main_jni"); } 4.) 在调用者Activity中定义函数 native int SomeFunc(); 5.) 在activity中调用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = new TextView(this); int i = SomeFunc(); tv.setText( String.valueOf(i) ); setContentView(tv); } //下面的第6.)第7.)步可以被集成的.cproject 在.project中添加plugin之后一键编译,不用单独起dos窗口了。由于没有找到生成.cproject的工具,只能手写,所以本文不使用该方法,以后找到了好的方法再补充。委屈 6.) 在dos窗口中,cd到项目路径下,运行ndk-build 命令,该命令会自动搜索该路径子目录下的native项目,进行编译(Note: 编译完成后不要忘记了刷新项目)。 7.) 重新编译部署项目,就可以看到已经包含了.so的apk运行在目标机上了。 摘自 http://stackoverflow.com/questions/13654678/how-compile-c-project-via-android-ndk 1). 如果不知道怎样安装使用windows版的NDK,可以参考 http://blog.youkuaiyun.com/do_script/article/details/26478583
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值