直接在Android Develop官网上下载NDK r9版本(如果无法登陆官网可以考虑使用自由门代理软件),解压缩后然后再环境变量中添加进去。此版本的优势是内部集成了ndk-build,可以作为替代原来的庞杂的cygwin来对native method进行编译。
部分我也放到了自己的网盘上:
http://yunpan.cn/QDjUeXchBRUHK
android-ndk-r9-windows-x86_64.zip
android-ndk-r8e-windows-x86_64.zip
android-ndk-r8e-windows-x86.zip
android-ndk-1.6_r1-windows.zip
新建一个类JniInterface,并在其中声明native method。
使用命令行进入JniInterface.java这个类的目录下,并使用javac JniInterface.java这个命令生成类对应的class文件。
将我们新生成的.class文件复制到bin文件对应的目录下,这里就是对应的包的目录下。:
然后cd命令回到/bin/classes这个目录下,使用javah -jni com.wxyyx.jnidemo.JniInterface这个命令编辑生成头文件。
命令格式:javah -jni 包名+类名
生成的头文件内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_wxyyx_jnidemo_JniInterface */
#ifndef _Included_com_wxyyx_jnidemo_JniInterface
#define _Included_com_wxyyx_jnidemo_JniInterface
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_wxyyx_jnidemo_JniInterface
* Method: IntFromJNI
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_wxyyx_jnidemo_JniInterface_IntFromJNI
(JNIEnv *, jobject);
/*
* Class: com_wxyyx_jnidemo_JniInterface
* Method: StringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_wxyyx_jnidemo_JniInterface_StringFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
将刚才生成的头文件复制到项目的jni目录下(没有则新建一个jni目录):
新建一个.c文档并将.h头文件包含进去:
Android.mk是JNI的makefile文件,基本语法如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniInterface
LOCAL_SRC_FILES := com_wxyyx_jnidemo_JniInterface.c
include $(BUILD_SHARED_LIBRARY)
最简单的只要指定生成的库名称与调用的头文件就可以了。
进入到工程的根目录下使用ndk-build命令,就生成了libJniInterface.so文件。
这里的虚拟机推荐使用genymotion,但是不要使用Nexus one这个型号的机器。
在JniInterface.class中添加一句声明:
static {
System.loadLibrary("JniInterface");
}
这边的库的名字不要lib也不要.so这些前缀与后缀。
在MainActivity中定义如下:
结果就是: