Android NDK开发的环境搭建与简单示例
一、ndk与jni简介
ndk全称为native development kit本地语言(c&c++)开发包。而对应的是经常接触的android-sdk,(software development kit)软件开发包(只支持java语言开发)。
简单来说利用ndk,可以开发纯c&c++的代码,然后编译成库,让利用android-sdk开发的java程序调用。ndk开发的可以称之为底层开发或者jni(java native interface)层开发,sdk开发可以称为上层开发。
android开发中使用ndk的原因:
1、众所周知,利用sdk编写的代码,生成的apk,很容易就可以反编译了,安全性极为不高,而利用ndk开发的库,不容易被反编译,保密性,安全性都提高了。
2、很多开源工程和大型工程都是c&c++代码,把它们转换为纯java语言显然是不可能的。
3、c&c++的代码运行速度和效率都比java快很多。
jni全称为java native interface(java本地调用)。从java1.1开始,jni成为java平台的一部分,它允许java代码和其他语言写的代码(如c&c++)进行交互。并非从android发布才引入jni的概念的。
简单来说,android的ndk提供了一些交叉编译工具链和android自带的库,这些android的库可以让开发者在编写本地语言的程序时调用。而ndk提供的交叉编译工具链就对已经编写好的c&c++代码进行编译,生成库。当然了,你也可以自己搭建交叉编译环境,而不用ndk的工具和库。然后生成库,只要规范操作,一样可以生成能让java层成功调用的库文件的。
二、ndk环境搭建
使用最新ndk,直接抛弃cygwin,以前做android的项目要用到ndk就必须要下载ndk,下载安装cygwin(模拟linux环境用的),下载cdt(eclipse c/c++开发插件),还要配置编译器,环境变量,特别麻烦,新版就不需要了。
下载android sdk http://developer.android.com/sdk/index.html
下载android ndk http://developer.android.com/tools/sdk/ndk/index.html (注:ndk版本在r7以上之后就集成了cygwin,而且还是十分精简版。)
本人使用的sdk和ndk为
eclipse配置
打开eclipse,点window->preferences->android->ndk,设置ndk路径,例如我的是f:android-ndk-r10e。新建一个android工程ndktest,在工程上右键点击android tools->add native support...,然后给我们的.so文件取个名字(默认已经起好了,就是包名ndktest)。这时候工程就会多一个jni的文件夹,jni下有android.mk和ndktest.cpp文件。android.mk是ndk工程的makefile,ndktest.cpp就是ndk的源文件。
接下来编写ndktest.cpp文件
<span style="font-size:14px;">#include <jni.h> #include <string.h> extern c jstring java_com_example_ndktest_mainactivity_ndktestfromjni(jnienv* env, jobject thiz) { return env->newstringutf(hello from jni !); } </string.h></jni.h></span>
继续编写mainactivity.java文件
<span style="font-size:14px;">package com.example.ndktest; import android.app.activity; import android.os.bundle; import android.widget.textview; public class mainactivity extends activity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); textview tv = new textview(this); tv.settext(ndktestfromjni()); setcontentview(tv); } public native string ndktestfromjni();// native声明,表示这个方法来自native层。实现过程已经在native层实现了 static { system.loadlibrary(ndktest);// 加载库,前面的lib和后缀名不用写 } } </span>
编译运行,先编译cpp文件,右击工程项目ndktest,build project,成功结果在libs目录下生成了.so文件
然后编译android java工程,右击工程项目run application,部署到真机上的结果
三、相关问题
ndk搭建与实例过程中,遇到的一些问题如下:
eclipse报错“unresolved inclusion jni.h”
在做ndk开发过程中有时候在eclipse里会遇到其无法处理inclusion导致symbol显示错误,网上有许多方法可以解决类似“unresolved inclusion jni.h” 错误的方法,包括includepath等方法,不过对我都不管用。
最终的解决办法就是初始化eclipse对该project的nativesupport:
1. 在eclipse中关闭指定project
2. 用其他编辑工具打开该project的.project文件,删除以下内容:
......
org.eclipse.cdt.managedbuilder.core.genmakebuilder
clean,full,incremental,
......
org.eclipse.cdt.managedbuilder.core.scannerconfigbuilder
full,incremental,
......
org.eclipse.cdt.core.cnature
org.eclipse.cdt.core.ccnature
org.eclipse.cdt.managedbuilder.core.managedbuildnature
org.eclipse.cdt.managedbuilder.core.scannerconfignature
3. 删除.cproject文件
4. 在eclipse里打开原来的project, refresh,然后右键->properties->android tools -> add native support
5. 搞定
window平台下 eclipse ndk开发中的method 'newstringutf' could not be resolved问题
项目右键->属性->c/c++常规->code analysis,选择use project settings 中的方法无法被解析(method cannot be resolved)取消选择,应用->确定,然后刷新、清理、刷新、build项目。
jni/hellocpp/main.cpp:16:18:error: base operand of '->' has non-pointer type 'jnienv {aka _jnienv}'
错误在于:
(*env)->newstringutf(env, hello from jni !);
这一行,这是c的写法,而我的是cpp程序,需要改写成:
env->newstringutf( hello from jni !);
java.lang.unsatisfiedlinkerror:native method not found问题
1、c++中的方法java_xxx_xxx中的java 首字母一定要大写
2、如果是 .cpp 文件则用 extern c {您的方法在这里},大括号里是您的本地方法。
以上就是对android ndk环境搭建及示例代码,做的整理,后续继续补充相关资料谢谢大家对本站的支持!
推荐阅读
-
Android NDK开发的环境搭建与简单示例
-
Android开发中CheckBox的简单用法示例
-
利用adt-bundle轻松搭建Android开发环境与Hello world(Linux)
-
利用adt-bundle轻松搭建Android开发环境与Hello world(Windows)
-
Android开发中CheckBox的简单用法示例
-
Android开发-之环境的搭建(图文详解)
-
j2ee 简单网站搭建:(二)添加和配置 spring + spring-mvc 的 mvc 开发环境
-
Android开发之ListView的简单用法及定制ListView界面操作示例
-
五步搞定Android开发环境部署非常详细的Android开发环境搭建教程
-
Java开发微博粉丝服务(1)——环境的搭建,开发接入与URL有效性验证