简单JNI实现程序

系统 1664 0

 

简单JNI实现程序


简单JNI实现程序
图来自百度百科 词条: 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

 

简单JNI实现程序


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论