简单JNI实现程序
内容相关知识来源于网络
1. 编写Java类代码(JNITest.java)
// A simple JNI program. // author: jarg // http://jarg.iteye.com/ public class JNITest { private native int max(int[] elements); // declare the function: max. public static void main(String[] args) { int[] elements = {2,3,11,5,8,1,5,24,11,32}; System.loadLibrary("Maxdll"); // load the function in dll. // output the max one in array elements. System.out.println("The max one of elements: " + new JNITest().max(elements)); } }
该Java程序用来测试,调用本地函数即动态链接库(Maxdll.dll)中的函数.
private native int max(int[] elements);声明本地函数.
System.loadLibrary("Maxdll");用于加载动态链接库
new JNITest().max(elements);向本地函数传入一个整型数组,执行本地函数max求数组中最大值的操作.
2. 编译成字节代码(JNITest.class)
编译JNITest.java,生成相应的.class文件.
3. 产生C头文件(JNITest.h)
命令中输入javah JNITest生成JNITest.h的头文件.
JNITest.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JNITest */ #ifndef _Included_JNITest #define _Included_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: JNITest * Method: max * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_JNITest_max (JNIEnv *, jobject, jintArray); #ifdef __cplusplus } #endif #endif
头文件jni.h位于:jdk安装目录\include.
另外,jni.h包含的jni_md.h位于:jdk安装目录\include\win32.
函数max(int elements)以 JNIEXPORT jint JNICALL Java_JNITest_max(JNIEnv *, jobject, jintArray);的形式在JNITest.h头文件中被声明,然后在JNITest.cpp程序被实现.
JNIEXPORT 说明该函数是一个被外部程序调用的函数.
jint对应于Java语言中int型,C语言中的long(因为java中int型是32位,等长于C中long型)做为返回函数类型.
JNICALL(__stdcall)是函数调用约定的一种,表示
1.参数从右向左压入堆栈
2.函数被调用者修改堆栈
3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
函数名Java_JNITest_max: 外部调用语言为Java,类名为JNITest,函数名为max.
命名规则是: Java_类名_方法名.
特别的,当类在一个类包(例如,com.jarg)中时,点号用下划线代替,即为Java_com_jarg_JNITest_max.
函数参数: JNIEnv *, jobject, jintArray 其中,JNIEnv是在jni.h中定义的JNI环境,jintArray是传入参数elements对应的类型.(jobject不太清楚 )
4. 编写JNI实现代码(Maxdll.cpp)
VC++ 6.0 新建->工程->Win32 Dynamic-Link Library 工程命名为Maxdll
添加一个Maxdll.cpp文件到工程.
// the implement of max. // author: jarg // http://jarg.iteye.com/ #include "JNITest.h" #include "stdio.h" JNIEXPORT jint JNICALL Java_JNITest_max(JNIEnv *env, jobject obj, jintArray elements) { int max; jint *result = env->GetIntArrayElements(elements,false); if (result == NULL) { return 0; } for (int i=0; i<env->GetArrayLength(elements); i++) { if(i == 0) max = result[0]; if(result[i] > max) max = result[i]; } return max;
5. 编译成链接库文件(Maxdll.dll)
这是max函数对应的实现,经编译,连接后在工作空间\Debug中生成Maxdll.dll.
将其拷贝到.class文件目录下.
6. 运行Java程序(JNITest.java)
运行Java程序(java JNITest),得到调用本地函数max后的结果:
The max one of elements: 32
这类知识网上很多.
推荐链接: http://hi.baidu.com/leona_leon/blog/item/79f0090c71e022386059f388.html
http://hi.baidu.com/madrigar/blog/item/2635622755cfa504918f9d29.html
http://hi.baidu.com/madrigar/blog/item/10175d60936b0cd88db10d95.html
http://hi.baidu.com/madrigar/blog/item/cc7f242d89ef7a33349bf797.html
http://hi.baidu.com/madrigar/blog/item/4502b999895d160f6e068cee.html