当前位置: 代码迷 >> Android >> Android NDK开发引见
  详细解决方案

Android NDK开发引见

热度:9   发布时间:2016-04-28 00:24:22.0
Android NDK开发介绍

一、 JNI基础介绍

JNI is the Java Native Interface. It defines a way for managed code (written in the Java programming language) to interact with native code (written in C/C++).
JNI(Java本地接口):定义一种方式,使得Java代码能与C代码或者Dynamic Shared Libraries(动态共享库)进行交互。
调用方式:


C代码通过编译生成一个.so动态共享库,供java代码调用。

二、 NDK开发介绍

NDK 是 Google为Android提供做C/C++代码开发的工具包,包含GCC的编译器以及各个平台(arm,X86,MIPS)的相关头文件,交叉编译的一些平台相关文件等。可在google官网上下载。

1、Eclipse配置下载的NDK资源包位置

解压下载的NDK包,android-ndk-r9b-windows-x86.zip
Preferences——>Android——>NDK,配置ndk所在位置

2、开发使用Demo

new一个普通Android工程TestJni;
右键项目,Android Tools——>Add Native Support,输入想要生成动态库名字:TestJni;
此时,会多出一个jni文件夹,包括一个TestJni.c和Android.mk文件。
Android.mk 配置编译相关动作,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := TestJni
LOCAL_SRC_FILES := TestJni.c
include $(BUILD_SHARED_LIBRARY) 

注:

BUILD_SHARED_LIBRARY:表示编译目标为动态共享库,即生成.so文件

LOCAL_MODULE:编译目标名

LOCAL_SRC_FILES:编译源文件


TestJni.c即本地C代码,本例中只加了一个Hello字串的返回,此方法名的定义,为了使得java代码能够找到相应的native代码,其规范为:Java+包名+class+Method,否则找不到。
当然可以有另外一种方法映射的途径,可以实现java到C方法的映射,在此不详细介绍了。

jstring Java_com_pingtech_testjni_TestJni_sayHello( JNIEnv* env,        jobject thiz ){	return (*env)->NewStringUTF(env, "Hello from JNI !");}

3、JNI java代码

public class TestJni{		public static native String sayHello();		static{			System.loadLibrary("TestJni");		}}
使用静态代码块,首先加载TestJni.so 动态共享库,sayHello为C中本地方法,前面加一个native修饰符即可。这个我们直接可以通过TestJni.sayHello();在Java代码中调用C代码了。

4、编译运行

Project build all,可检测本地代码错误,生成.so库(lib/armeabi下,这个对于arm平台,当然可以通过配置编译出其他平台的)。


  相关解决方案