1、下载android-ndk-r13b-windows-x86_64.zip,这个版本不需要配置cygwin,低版本的需要,为了避免麻烦下载最新的就好。
2、点击项目properties属性选择Builders项,New一个Program,命名随意。
如此设置之后,该项目的NDK环境便配置成功了。下面就是开始编写java jni 接口啦
3、编写个java class 文件 里面定义native方法
4、用javac编译这个java文件,再用javah生成头文件
生成的com_lpf_utils_JniClient.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_lpf_utils_JniClient */
#ifndef _Included_com_lpf_utils_JniClient
#define _Included_com_lpf_utils_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lpf_utils_JniClient
* Method: nv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nv
(JNIEnv *, jobject);
/*
* Class: com_lpf_utils_JniClient
* Method: snv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snv
(JNIEnv *, jclass);
/*
* Class: com_lpf_utils_JniClient
* Method: nr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nr
(JNIEnv *, jobject);
/*
* Class: com_lpf_utils_JniClient
* Method: snr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snr
(JNIEnv *, jclass);
/*
* Class: com_lpf_utils_JniClient
* Method: nvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nvp
(JNIEnv *, jobject, jint);
/*
* Class: com_lpf_utils_JniClient
* Method: snvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snvp
(JNIEnv *, jclass, jint);
/*
* Class: com_lpf_utils_JniClient
* Method: nrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nrp
(JNIEnv *, jobject, jint);
/*
* Class: com_lpf_utils_JniClient
* Method: snrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snrp
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
#include <jni.h>
/* Header for class com_lpf_utils_JniClient */
#ifndef _Included_com_lpf_utils_JniClient
#define _Included_com_lpf_utils_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lpf_utils_JniClient
* Method: nv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nv
(JNIEnv *, jobject);
/*
* Class: com_lpf_utils_JniClient
* Method: snv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snv
(JNIEnv *, jclass);
/*
* Class: com_lpf_utils_JniClient
* Method: nr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nr
(JNIEnv *, jobject);
/*
* Class: com_lpf_utils_JniClient
* Method: snr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snr
(JNIEnv *, jclass);
/*
* Class: com_lpf_utils_JniClient
* Method: nvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nvp
(JNIEnv *, jobject, jint);
/*
* Class: com_lpf_utils_JniClient
* Method: snvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snvp
(JNIEnv *, jclass, jint);
/*
* Class: com_lpf_utils_JniClient
* Method: nrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nrp
(JNIEnv *, jobject, jint);
/*
* Class: com_lpf_utils_JniClient
* Method: snrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snrp
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
Java_com_lpf_utils_JniClient_snrp 的格式为 Java_包名_类名_函数名
5、在项目根目录下创建jni目录,名字一定要取 jni
然后添加Android.mk Application.mk文件
如果需要使用使用SWIG生成JAVA类和C/C++封装代码,请参考
http://blog.csdn.net/koozxcv/article/details/50779806。
6、将
com_lpf_utils_JniClient.h放进jni目录,并实现com_lpf_utils_JniClient.c(你也可以用c++的语法去实现,c与c++实现的区别在于两者对JNIenv* 指针的操作不同),下面是我的示例
//#include "com_lpf_utils_JniClient.h"
//#include <stdlib.h>
//#include <stdio.h>
#include <jni.h>
#include <string.h>
#ifdef __cplusplus
extern "C"
{
#endif
/*
* Class: com_ndk_test_JniClient
* Method: AddStr
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lpf_utils_JniClient_AddStr
(JNIEnv* env, jclass arg, jstring instringA, jstring instringB)
{
jstring str = (*env)->NewStringUTF(env,"Hello JNI");
return str;
}
/*
* Class: com_ndk_test_JniClient
* Method: AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_AddInt
(JNIEnv* env, jclass arg, jint a, jint b)
{
return a + b;
}
/*
* Class: com_lpf_utils_JniClient
* Method: nv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nv
(JNIEnv *env, jobject jo){
}
/*
* Class: com_lpf_utils_JniClient
* Method: snv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snv
(JNIEnv *env, jclass jc){
}
/*
* Class: com_lpf_utils_JniClient
* Method: nr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nr
(JNIEnv *env, jobject jo){
return 0;
}
/*
* Class: com_lpf_utils_JniClient
* Method: snr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snr
(JNIEnv *env, jclass jc){
return 0;
}
/*
* Class: com_lpf_utils_JniClient
* Method: nvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nvp
(JNIEnv *env, jobject jo, jint a){
}
/*
* Class: com_lpf_utils_JniClient
* Method: snvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snvp
(JNIEnv *env, jclass jc, jint a){
}
/*
* Class: com_lpf_utils_JniClient
* Method: nrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nrp
(JNIEnv *env, jobject jo, jint a){
return 0;
}
/*
* Class: com_lpf_utils_JniClient
* Method: snrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snrp
(JNIEnv *env, jclass jc, jint a){
return 9527;
}
#ifdef __cplusplus
}
#endif
//#include <stdlib.h>
//#include <stdio.h>
#include <jni.h>
#include <string.h>
#ifdef __cplusplus
extern "C"
{
#endif
/*
* Class: com_ndk_test_JniClient
* Method: AddStr
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lpf_utils_JniClient_AddStr
(JNIEnv* env, jclass arg, jstring instringA, jstring instringB)
{
jstring str = (*env)->NewStringUTF(env,"Hello JNI");
return str;
}
/*
* Class: com_ndk_test_JniClient
* Method: AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_AddInt
(JNIEnv* env, jclass arg, jint a, jint b)
{
return a + b;
}
/*
* Class: com_lpf_utils_JniClient
* Method: nv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nv
(JNIEnv *env, jobject jo){
}
/*
* Class: com_lpf_utils_JniClient
* Method: snv
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snv
(JNIEnv *env, jclass jc){
}
/*
* Class: com_lpf_utils_JniClient
* Method: nr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nr
(JNIEnv *env, jobject jo){
return 0;
}
/*
* Class: com_lpf_utils_JniClient
* Method: snr
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snr
(JNIEnv *env, jclass jc){
return 0;
}
/*
* Class: com_lpf_utils_JniClient
* Method: nvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_nvp
(JNIEnv *env, jobject jo, jint a){
}
/*
* Class: com_lpf_utils_JniClient
* Method: snvp
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_lpf_utils_JniClient_snvp
(JNIEnv *env, jclass jc, jint a){
}
/*
* Class: com_lpf_utils_JniClient
* Method: nrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_nrp
(JNIEnv *env, jobject jo, jint a){
return 0;
}
/*
* Class: com_lpf_utils_JniClient
* Method: snrp
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_lpf_utils_JniClient_snrp
(JNIEnv *env, jclass jc, jint a){
return 9527;
}
#ifdef __cplusplus
}
#endif
7、保存好,clean一次,就可以看到ndk编译成功了.
8.加载并调用