NDK简介
ndk(Native develop kits 本地开发包),可以让你开发JNI程序(本地方法,对应了C或C++中的方法)。
配置NDK-build的环境变量:计算机->右键 属性-高级系统设置->环境变量->path->粘贴D:\develops\android-ndk-r9d;步骤
I. 在java中写了一个本地方法:
// 定义一个本地的方法,这个方法,就相当于C程序中的方法
public native int hello();
II. 在工程的根目录下中创建了jni目录;
III. 在jni目录下写一个c文件,在c文件中实现本地方法:
#include <stdio.h>
#include <stdlib.h>
//Java_java代码中本地方法的全路径,然后把其中的.替换成_,然后在写方法体
// 注意方法的格式
int Java_cn_itcast_jnihelloworld_MainActivity_hello(){
return 5;
}
IV. 打包c程序,生成动态库:
```
在jni目录下创建Android.mk,添加脚本:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
在dos窗口中切换到工程的目录下,执行ndk-build,生成动态库;
```
V. 在java代码中调用本地方法:
// 1.加载动态库(里面是c代码)
// 动态库的 名称:libhello.so ,把前面的lib和后面的.so去掉
System.loadLibrary("hello");
// 2.调用本地方法(相当于调用c程序的方法)
int result = hello();
- 使用javah生成头文件
I.如果jdk的版本是1.7,在dos窗口中切换到工程的src目录下:E:\projects\preLesson\xian03\12\userjavah\src;如果是1.6,应该切换到E:\projects\preLesson\xian03\12\userjavah\bin\classes下,使用javah命令生成头文件:E:\projects\preLesson\xian03\12\userjavah\src>javah cn.itcast.jnihelloworld.MainActivity,刷新工程;
II.把头文件拖到jni目录下;
III.把头文件中的方法拷贝到c文件中,写方法体,把jni导入到c文件中;
VI.使用ndk-build命令重新生成动态库;
V.在java代码中调用本地方法:
// 1.加载动态库(里面是c代码)
// 动态库的 名称:libhello.so ,把前面的lib和后面的.so去掉
System.loadLibrary("hello");
// 2.调用本地方法(相当于调用c程序的方法)
int result = hello();
-
2. Android.mk文件说明
// $表示调用ndk中定义好的方法或者变量
// 加载本地的jni目录,当在dos窗口中执行ndk-build命令时,会找工程目录下中的jni目录;
LOCAL_PATH := $(call my-dir)
// 下次重新生成动态库时,清理掉上次生成的变量
include $(CLEAR_VARS)
// 指定生成的动态库的名称,生成动态库文件后,文件名为libhello.so
LOCAL_MODULE := hello
// 指定了本地的c文件
LOCAL_SRC_FILES := helloworld.c
// 指定了生成库的类型:BUILD_SHARED_LIBRARY表示动态库.so,BUILD_STATIC_LIBRARY表示静态库.a
// 动态库.so文件小,静态库.a文件大。
include $(BUILD_SHARED_LIBRARY)
3.简便的开发流程
1.在Java代码中写一个本地方法;
2.使用javah命令生成头文件;
3.在eclipse中指定ndk的路径:window->preference->Android->NDK->NDK Locations:D:\develops\android-ndk-r9d
4.给工程添加jni的本地支持:右键工程->android tools->add native support...;设置库的名称。这一步可以在工程目录下生成jni目录及其目录下的mk、c文件。
5.把jni下的cpp文件改成c文件,并且把mk文件中的.cpp改成.c;
6.把头文件拖到jni目录下;
7.设置JNI头文件的路径:右键工程->properties->C/C++ General->includes->add-File System->D:\develops\android-ndk-r9d\platforms\android-8\arch-arm\usr\include;
8.把头文件引入到c文件中,把头文件中的方法拷贝到c文件中,实现这个方法;
9.选中工程,点击eclipse上面的小锤子,生成动态库;
10.在java代码中调用本地方法:
// 1.加载动态库(里面是c代码)
// 动态库的 名称:libhello.so ,把前面的lib和后面的.so去掉
System.loadLibrary("hello");
// 2.调用本地方法(相当于调用c程序的方法)
int result = hello();