Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3354868
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: LINUX

2010-03-30 09:36:53


JAVA可以通过JNI接口访问本地的动态连接库,从而扩展JAVA的功能。使用JAVA JNI接口主要包括以下步骤:
(1)编写JAVA代码,注明要访问的本地动态连接库和本地方法;
(2)编译JAVA代码得到.class文件;
(3)使用javah -jni 生成该类对应的C语言.h文件;
(4)使用C/C++实现(3)生成的.h文件中声明的各函数;
(5)编译C/C++实现代码生成动态连接库。
本文使用一个简单的helloWorld示例演示JNI的使用。

(1)编写JAVA代码
public class helloWorld
{
    public native void SayHello(String name);

    static
    {
        System.loadLibrary("examdll");
    }

    public static void main(String [] argv)
    {
        helloWorld hello = new helloWorld();
        hello.SayHello("myName");
    }
}

(2)编译JAVA代码

javac helloWorld.java

(3)生成实现函数头文件

javah -classpath . helloWorld

得到的文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class helloWorld */

#ifndef _Included_helloWorld
#define _Included_helloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     helloWorld
 * Method:    SayHello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_helloWorld_SayHello
  (JNIEnv *, jobject, jstring);


#ifdef __cplusplus
}
#endif
#endif

(4)在VC中实现上述函数

#include "helloWorld.h"
#include
#include
void JNICALL Java_helloWorld_SayHello(JNIEnv * env, jobject obj, jstring str)
{
    jboolean  b  = true;
    char s[80];
    memset(s, 0, sizeof(s));
    strcpy_s(s ,(char*)env->GetStringUTFChars(str, &b));
    printf("Hello, %s", s);
    env->ReleaseStringUTFChars(str , NULL);
}

**** 这是JNI的关键:通过env我们可以使用JAVA提供的一组函数操作与转换函数传递的参数。

(5)编译VC项目得到动态连接库 examdll.dll。
阅读(585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~