Android NDK介绍及JNI调用

Android NDK是用来编译能在手机ARM平台上运行的,通过C/C++编写的LIB库。

注:理论上不只在ARM平台,以后应该也能在Intel x86平台上运行的。

JNI调用,是为了使java能够调用C/C++所编写的程序的一种机制。

Android NDK和JNI调用结合,就能够使Android程序,调用原生底层用C/C++实现的功能。

1.NDK开发环境配置

在Windows下开发需要安装Cygwin,安装时除了默认选择项外,还要选中gcc和make.

在Linux下,如Ubuntu,通过apt-get 安装gcc和make即可。

然后下载NDK,解压到特定的目录(如:D:\Android)

由于awt兼容性的问题,需要将D:\Android\android-ndk-r7\prebuilt\windows\bin中的awt.exe改为awt_.exe.(我使用ndk是r8,cygwin是最新版,不修改也行)

同时把D:\Android\android-ndk-r7加入到系统的PATH中,方便使用,

打开Cygwin,cd到/cygdrive/d/Android/android-ndk-r7/samples/hello-jni/jni目录,输入ndk-build,测试环境是否正常

出现以上显示的内容,即表示环境配置正常。

注:/cygdrive/d/即表示windows中的D盘。

2.开发Android测试程序

新建一个Android项目hello,包名com.hello

把自动生成的HelloActivity中修改为以下内容


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class HelloActivity extends Activity {
 
     private static final String TAG = "Hello" ;
 
     static {
         System.loadLibrary( "hello" );
     }
 
     private native String printJNI();
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
         Log.d(TAG, printJNI());
     }
}

通过System.loadLibrary(“hello”)加载C编写的LIB,并定义native方法printJNI,最后调用printJNI()方法测试。

3.开发C语言程序,并通过NDK编译

在新建在helo项目的根目录下新建jni目录,如D:\MyWorkSpace3\hello

打开终端,转到D:\MyWorkSpace3\hello\,执行



javah -classpath bin/ -d jni com.hello.HelloActivity
或者

javah -classpath bin/classes -d jni com.hello.HelloActivity

执行成功后,会在jni目录下生成com_hello_HelloActivity.h头文件;
接着在jni目录下新建一个C文件com_hello_HelloActivity.c,编写如下代码:









#include "com_hello_HelloActivity.h"
#define LOG_TAG "JNITest"
#undef LOG
JNIEXPORT jstring JNICALL Java_com_hello_HelloActivity_printJNI
(JNIEnv * env, jobject obj)
{
return (*env)->NewStringUTF(env, ( char *) "JNITest Native String" );
}

再在jni目录下新建一个Android.mk文件,用于配置编译的文件及选项










LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := com_hello_HelloActivity.c
 
include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH指编译文件的目录,$(call my-dir)指向当前目录
LOCAL_MODULE指定编译生成的lib名字
LOCAL_SRC_FILES指需要编辑的源文件,可自动多个文件,换行时用\分隔

完成后打开Cygwin,cd到项目的jni目录下,
比如/cygdrive/d/MyWorkSpace3/hello/jni
执行ndk-build(如果ndk 没有加入环境变量 可以使用绝对路径 如 /cygdrive/d/Android/android-ndk-r8/ndk-build)

生成的lib文件会安装到\libs\armeabi下,名称为libhello.so,但注意在java加载中只用写hello作为lib名称就可以了。

4.检测执行结果

在eclipse中刷新项目,运行,在logcat中应该可以看到“JNITest Native String”


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值