`
coolerbaosi
  • 浏览: 727053 次
文章分类
社区版块
存档分类
最新评论

Ubuntu 下用 Eclipse 编译调试 Android NDK 工程

 
阅读更多

一、开发环境搭建:
1.首先,要给 Eclipse 安装 CDT :
<wbr> 选择菜单 [Help] -&gt; [Install newsoftware...],<br><wbr> 弹出 "Install" 窗口,<br><wbr> 点击 Add 按钮,弹出 "Add Repository" 窗口,<br><wbr> 在 Name: 文本框中输入 CDT ,<br><wbr> 在 Location: 文本框中输入http://download.eclipse.org/tools/cdt/releases/juno<br><wbr> 点击 OK 按钮保存,<br><wbr><br><wbr> 选择 Work with: 下列拉表框中的:<br><wbr> CDT -http://download.eclipse.org/tools/cdt/releases/juno<br><wbr><br><wbr> 将 CDT Main Features 和 CDT Optional Features两项全选中,<br><wbr> 点击 Next&gt; 按钮,按提示点击安装即可!<br><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

2.然后,要给 Eclipse 安装 Sequoyah :
<wbr> 选择菜单 [Help] -&gt; [Install newsoftware...],<br><wbr> 弹出 "Install" 窗口,<br><wbr> 点击 Add 按钮,弹出 "Add Repository" 窗口,<br><wbr> 在 Name: 文本框中输入 Sequoyah ,<br><wbr> 在 Location: 文本框中输入http://download.eclipse.org/sequoyah/updates/2.0<br><wbr> 注:在 http://www.eclipse.org/sequoyah/downloads/这里可以得到最新版的地址。<br><wbr> 点击 OK 按钮保存,<br><wbr><br><wbr> 选择 Work with: 下列拉表框中的:<br><wbr> sequoyah-2.0 -http://download.eclipse.org/sequoyah/updates/2.0<br><wbr><br><wbr> 注意:一定要将 "Group items by category"复选框的对勾去掉,<br><wbr>    不然会显示为 "There are no categorized items"!!!<br><wbr><br><wbr> 将 [Sequoyah Android 本地化编辑器] 和 [Sequoyah Android本机代码支持] 两项全选中,<br><wbr> 点击 Next&gt; 按钮,按提示点击安装即可!<br><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程
<wbr><br> 3.最后,要设置本机开发 NDK 位置:<br><wbr> 选择菜单 [Window] -&gt;[Preferences],<br><wbr> 弹出 "Preferences" 窗口,<br><wbr> 在左侧窗栏中选择 Android -&gt; 本机开发选项,<br><wbr> 在右侧窗栏中点击 Browse... 按钮,选择 NDK 解压后的目录,<br><wbr> 点击右下角的 Apply 按钮保存设置。<br><br></wbr></wbr></wbr></wbr></wbr></wbr>Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

4.把 NDK 目录下的 ndk-gdb 脚本的最后一句注释掉!
<wbr> #$GDBCLIENT -x `native_path $GDBSETUP`<br><br> 5.将 android-ndk-r8b 和 android-sdks/platform-tools 的全路径添加到 PATH环境变量中:<br><wbr> $ sudo gedit /etc/environment<br><wbr> 注:添加完之后用 $ . /etc/environment 重新加载一下新的 PATH变量值。<br><wbr>   因为 ndk-build、ndk-gdb、adb 等脚本或工具要被调用时需要。<br><br> 二、开发环境使用:<br></wbr></wbr></wbr></wbr>
Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

1.新建或导入一个 Android 工程 TestJniPro,修改 java 代码,引用了一个本地库函数,例如:
<wbr> @Override<br><wbr> public void onCreate(Bundle savedInstanceState){<br><wbr><wbr><wbr><wbr><wbr>super.onCreate(savedInstanceState);<br><wbr><wbr><wbr><wbr><wbr>setContentView(R.layout.activity_orange);<br><wbr><wbr><wbr><wbr><wbr>new AlertDialog.Builder( this ).setMessage( sayHello()).show();<br><wbr> }<br><br><wbr> public native String sayHello(); // 本地库函数<br><wbr> static<br><wbr> { <wbr><br><wbr><wbr><wbr><wbr><wbr>System.loadLibrary( "NativeCode" ); <wbr><br><wbr> }<br><wbr><br> 2.在 工程名 上点击 右键 选择菜单 [Android Tools] -&gt; [Add NativeSupport...],<br><wbr> 弹出 "添加 Android 本机支持" 窗口,<br><wbr> 确认一下 NDK 位置是否正确,<br><wbr> 修改一下 将添加库名称 lib*.so下的文本框中的库名(不含lib和.so)为你想要起的名字(如:NativeCode),<br><wbr> 点击 finish 按钮后,<br><wbr> 工程目录中应该多了一个 jni 目录,目录中有两个文件 库名.cpp 和 Android.mk。<br><wbr> (例如:NativeCode.cpp)<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程
<wbr><br> 3.在 终端 里进入 jni 目录下,然后执行如下命令创建 jni 样式的头文件:<br><wbr> $ javah -classpath ../bin/classeswzh.nsc.TestJniProActivity<br><wbr> 注:TestJniProActivity 类中定义引用了本地库函数,所以要用它来创建 jni样式的头文件。<br><br> 4.在 NativeCode.cpp 文件中添加代码:<br><wbr> #include "wzh_nsc_OrangeActivity.h"<br><wbr><br><wbr> JNIEXPORT jstring JNICALL<br><wbr> Java_wzh_nsc_orange_OrangeActivity_sayHello(JNIEnv* env,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> jobject this)<br><wbr> {<br><wbr><wbr><wbr><wbr><wbr>return env-&gt;NewStringUTF( "Hello, I'm an Demo!");<br><wbr> }<br><br> 5.编译工程,如果出现如下错误:<br><wbr> Method 'NewStringUTF' could not beresolved<wbr> 源代文件名.c<wbr>/TestJNIC/jni<wbr> line 6<wbr> SemanticError <wbr><br><wbr> Type 'JNIEnv' could not beresolved<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>源代文件名.c<wbr> /TestJNIC/jni<wbr> line4<wbr> Semantic Error <wbr><br><wbr> Type 'jobject' could not beresolved<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>源代文件名.c<wbr> /TestJNIC/jni<wbr> line4<wbr> Semantic Error <wbr><br><wbr> Type 'jstring' could not beresolved<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>源代文件名.c<wbr> /TestJNIC/jni<br><wbr><br><wbr> 解决办法:<br><wbr> 右键点击 工程名 ,选择菜单 [Properties],<br><wbr> 弹出 "Properties for 工程名" 窗口,<br><wbr> 在窗口左窗栏中选择 C/C++ General -&gt; Pathsand Symbols ,<br><wbr> 在窗口右窗栏中选择 Includes 选项页,<br><wbr> 在 Language 栏中的<br><wbr> GNU C 和 GNU C++ 添加绝对路径/android-ndk-r8b/platforms/android-8/arch-arm/usr/include<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

6.创建 Android 虚拟机,并运行它。


7.右键点击 工程名 ,选择菜单 [Run As]-> [1 Android Application],
<wbr>来运行测试上面的程序是否可以正常运行。</wbr>
<wbr> 注:如果在 Problems选项页中出现类似如下错误:</wbr>
<wbr> make: *** No rule tomake target `工程名_scd.mk'.<wbr> Stop.<wbr>工程名 [Discovery Options] page in projectproperties<wbr> C/C++ Problem</wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr> 解决办法:</wbr>
<wbr> 右键点击 工程名 ,选择菜单[Properties],</wbr>
<wbr> 弹出 "Properties for 工程名"窗口,</wbr>
<wbr> 在窗口左窗栏中选择 C/C++ Build,</wbr>
<wbr> 在窗口右窗栏中选择 BuilderSettings 选项页,</wbr>
<wbr> 去掉 Use default buildcommand 复选框的对勾,</wbr>
<wbr> 修改 Build command:后面文本框中 ndk-build 为全路径!</wbr>
<wbr> 在窗口右窗栏中选择 Behaviour选项页,</wbr>
<wbr> 修改 Build(Incrementalbuild) 后面文本框将 V = 1 去掉,使之成为空文本框!</wbr>

Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

<wbr>注:如果此问题在联机调试依然存在,直接在它上面点击右键选删除即可!</wbr>

Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

8.修改工程配置文件 AndroidManifest.xml ,将 Debuggable 标志设置为 true。
Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

9.在 终端 中进入 工程目录 ,执行 ndk-gdb 命令,
<wbr> 将在 obj/local/armeabi 中生成了app_process(可执行程序)、gdb.setup(配置文件) 等新文件。<br><wbr> 注:执行这一步骤时,应当先确保程序是在模拟器中运行着。<br><wbr><br><wbr> 右键点击 工程名 ,选择菜单 [Debug As] 或 主菜单 [Run]-&gt; [Debug Configurations...],<br><wbr> 弹出 "Debug Configurations" 窗口,<br><wbr> 在窗口左窗栏中 双击 C/C++ Application ,其下才会出现 工程名 Default选项,点击选择它,<br><wbr> 在窗口右窗栏中选择 Main 选项页,<br><wbr> 点击 Browse... 按钮,<br><wbr><br><wbr> 修改 C/C++ Application: 下面的文本框内容为工程目录下/obj/local/armeabi/app_process<br><wbr> 注:这个文件是专为调试而存在的,假如发现找不到这个文件的话,就应当先在工程目录下运行一次ndk-gdb 。<br><wbr><br><wbr> Project: 下面的文本框选择当前工程,一般不用修改,默认就是当前工程。<br><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>修改Build(if required)before launching 组下的</wbr></wbr>
<wbr></wbr><wbr>Selectconfiguration using 'C/C++ Application' 复选框打上勾;</wbr>
<wbr></wbr><wbr>Disableauto build 单选框被选中;</wbr>

Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程
<wbr></wbr><wbr></wbr>
<wbr> 点击当前窗口正下方的 Using GDB(DSF) CreateProcess Launcher - Select other...</wbr>
<wbr> 弹出 "Select PreferredLauncher" 窗口,</wbr>
<wbr> 将 Use configurationspecific settings Change Workspace Settings... 复选框勾选,</wbr>
<wbr> 选中 Launchers: 列表框中的Standard Create Process Launcher</wbr>
<wbr></wbr>
Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程

<wbr> 在窗口右窗栏中选择 Debugger 选项页,<br><wbr> 修改 Debugger: 下拉列表框选项为 gdbserver</wbr></wbr>
<wbr>去掉 Stop on startup at:main 之前的对勾,即不勾选此复选框</wbr>
<wbr> 修改 Debugger Options 组下的 Main 选项页中的 GDB debugger:后的文本框值为:</wbr>

<wbr>绝对目录/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb</wbr>
<wbr>注:这个路径下有很多文件针对其他平台的,别选错了。</wbr>
<wbr></wbr>
<wbr> 修改 Debugger Options 组下的Main 选项页中的 GDB command file: 后的文本框值为:</wbr>
<wbr>工程目录下/obj/local/armeabi/gdb2.setup</wbr>
<wbr> 注:把工程目录下/obj/local/armeabi/gdb.setup 复制一份,命名为 gdb2.setup,</wbr>
<wbr>   把 gdb2.setup 最后一行的target remote :5039 去掉。</wbr>
<wbr>   </wbr>
<wbr>   不设置指向 gdb.setup的原因是:</wbr>
<wbr>   因为每次调用 ndk-gdb的时候,都会产生一个新的 gdb.setup 来覆盖掉修改过的 gdb.setup 。</wbr>
<wbr></wbr>
<wbr> 在 Debugger Options 组下的Main 选项页中的</wbr>
<wbr> Verbose console mode 和Use full file path to set breakpoints 两个复选框要勾上,</wbr>
<wbr> 注:只有 Verbose consolemode 记得勾上,才能在 Eclipse 控制台中用指令来与 gdb 交互。</wbr>
<wbr></wbr>
<wbr> 在 Debugger Options 组下的Connection 选项页中</wbr>
<wbr> 修改 Type: 下拉列表框的值为TCP</wbr>
<wbr> 修改 Host name or IPaddress: 文本框的值为 localhost</wbr>
<wbr> 修改 Port number: 文本框的值为5039 </wbr>
<wbr> (注:因为 gdb.setup 的最后一行target remote :5039 所以 Port number 设此值。)</wbr>
<wbr></wbr>
<wbr> 点击当前窗口右下角的 Apply按钮保存应用。</wbr>

<wbr></wbr>注:一定要点击 Debug 按钮,不然下图中的 TestJniPro_Default就不会出现在菜单中!
<wbr><br> 10.现在就可以给代码设置断点了,一定要在调用 本地库函数 之前和之后各设置一个断点!<br><wbr><wbr>注:因为要给运行 ndk-gdb 留出时间。<br><wbr><wbr> 开始正式的调试:<br><wbr><wbr> 先运行项目的 java 调试,程序会运行到调用 本地库函数之前的断点处停下来,<br><wbr><wbr> 这个时候赶紧运行 终端 进入工程目录,然后运行ndk-gdb ,运行之后是没有任何输出的,<br><wbr><wbr> 然后启动 C/C++ 的 debug,即上面配置好的那个:<br><wbr><wbr> 右键点击 工程名 ,选择菜单 [Debug As] 或主菜单 [Run] -&gt; [Debug Configurations...],<br><wbr><wbr> 弹出 "Debug Configurations"窗口,<br><wbr><wbr> 在窗口左窗栏中 双击 C/C++ Application,其下才会出现 工程名 Default 选项,就是这个!<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>Ubuntu<wbr>下用<wbr>Eclipse<wbr>编译调试<wbr>Android<wbr>NDK<wbr>工程
<wbr><wbr><br><wbr><wbr> Android的模拟器是可以正常使用超级用户的权限的,<br><wbr><wbr> 当你是用真机设备调试的时候请确保你的真机设备已经 root,<br><wbr><wbr>否则会出现一些权限的错误,甚至导致莫名奇妙的问题...<br><br> 对于 ndk-build 可编译成功并无任何错误、警告的代码,Eclipse 提示如下相关的错误:<br> "Symbol is not resolved"<br> "Member declaration not found"<br> "Invalid template argument"<br> "Invalid arguments"<br> "Method cannot be resolved"<br> 等等<br><br> 我的这个解决方案,可能并非完美解决方案,但是至少它将让你通过 Eclipse 点击 运行 或 调试 :<br> 1.右键点击你的 Android 工程并选择属性;<br> 2.在 C/C++ General 下点击 Code Analysis 项;<br> 3.选择 Use project settings 单选项框;<br> 4.将 Syntax and Semantic Errors 下的与 C++ 有关的实际能编译过去,但 Eclipse 报错误的,由错误 改成 警告 。<br> ndk-build 编译时将会捕捉到每一个无论何种方式地真实的错误,所以不会有什么隐患,<br> 对正确的 C++ 代码报错,可能是 Eclipse 的 bug !<br> (注:如果你知道更好的解决方案,请留言或发电子邮件告诉我啊,在此先谢过了 :))</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics