关于JNI的概念、原理,请谷歌之,这里介绍JNI的使用入门程序。
一、Java端
1.编写Java类Sample。
public class Sample {
//四种native方法,用于测试int、boolean、String和int[]
public native int intMethod(int n);
public native boolean booleanMethod(boolean bool);
public native String stringMethod(String text);
public native int intArrayMethod(int[] intArray);
public static void main(String[] args) {
//加载Dll
System.loadLibrary("MyDLL");
Sample sample = new Sample();
int square = sample.intMethod(5);
boolean bool = sample.booleanMethod(true);
String text = sample.stringMethod("JAVA");
int sum = sample.intArrayMethod(new int[] { 1, 1, 2, 3, 5, 8, 13 });
System.out.println("intMethod: " + square);
System.out.println("booleanMethod: " + bool);
System.out.println("stringMethod: " + text);
System.out.println("intArrayMethod: " + sum);
}
}
2. 编译Sample类,生成Sample.class。
javac Sample.java
3.编译Sample类,生成用于C++的.h头文件Sample.h。
javah -jni Sample
Sample.h内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Sample */
#ifndef _Included_Sample
#define _Included_Sample
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Sample
* Method: intMethod
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_Sample_intMethod
(JNIEnv *, jobject, jint);
/*
* Class: Sample
* Method: booleanMethod
* Signature: (Z)Z
*/
JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod
(JNIEnv *, jobject, jboolean);
/*
* Class: Sample
* Method: stringMethod
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Sample_stringMethod
(JNIEnv *, jobject, jstring);
/*
* Class: Sample
* Method: intArrayMethod
* Signature: ([I)I
*/
JNIEXPORT jint JNICALL Java_Sample_intArrayMethod
(JNIEnv *, jobject, jintArray);
#ifdef __cplusplus
}
#endif
#endif
二、C++端
1.在VS(笔者使用的是VS2010)新建Win32项目,名称为MyDLL(以便生成的dll文件名为MyDLL.dll),下一步选择工程为DLL,确定。
2.新建头文件Sample.h,内容为之前生成的Sample.h中的内容;或者可以导入之前生成的Sample.h。
3.新建cpp文件Sample.cpp,用于实现Sample.h文件中定义的函数。Sample.cpp内容如下:
#include "stdafx.h"
/*
* Class: Sample
* Method: intMethod
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_Sample_intMethod(JNIEnv *env, jobject obj, jint num)
{
return num*num;
}
/*
* Class: Sample
* Method: booleanMethod
* Signature: (Z)Z
*/
JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod(JNIEnv *env, jobject obj, jboolean boolean)
{
return !boolean;
}
/*
* Class: Sample
* Method: stringMethod
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Sample_stringMethod(JNIEnv *env, jobject obj, jstring str)
{
const char* s = env->GetStringUTFChars(str,0);
char cap[128];
strcpy(cap,s);
env->ReleaseStringUTFChars(str,s);
return env->NewStringUTF(strupr(cap));
}
/*
* Class: Sample
* Method: intArrayMethod
* Signature: ([I)I
*/
JNIEXPORT jint JNICALL Java_Sample_intArrayMethod(JNIEnv *env, jobject obj, jintArray array)
{
int i,sum = 0;
jsize len = env->GetArrayLength(array);
jint *body = env->GetIntArrayElements(array,0);
for(i=0;i<len;i++)
{
sum += body[i];
}
env->ReleaseIntArrayElements(array,body,0);
return sum;
}
3.在stdAfx.h中添加#include “Sample.h”引用。编译生成MyDLL.dll文件。
三、调用
在命令行中执行java程序,该程序调用C++本地代码实现。
java Sample
执行结果如图所示: