不同编译环境JNI使用

 

JNI(java调用dll)--DOS环境下和MyEclipse两种环境下

JAVA 2010-06-24 18:00:46 阅读423 评论0  字号: 订阅

调用带非字符类型,如整型(int),可参照下列,如为字符或字符串,阅读全文。

DOS环境下:

Java文件准备:

HelloNative.java

public class HelloNative {

public native static void greeting();

static

{

System.loadLibrary("HelloNative");

}

}

这个文件建好以后,先启动一个DOS窗口,按照下面步骤执行(注意,执行下面步骤,必须保证与Java源文件在同一目录下):

  1.  
    1. 编译:javac HelloNative .java  //生成HelloNative.class
    2. 生成DLL函数所需头文件(HelloNative.h):javah -jni HelloNative

HelloNative.h内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloNative
 * Method:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

测试文件:

HelloNativeTest.java

class HelloNativeTest
{  

public static void main(String[] args)

{  

new HelloNative().greeting(); 

}

}

编译生成执行类文件。

 

创建DLL:

启动VC6.0,按以下步骤执行:

新建工程:File  --->   New    --->   Projects   --->   Win32 Dynamic-Link Library      然后输入新建工程名称,最好是保持与要建的DLL

名字一样(这是第一次做,小心为上,随便起名,与DLL不同不知道会不会有问题,改天再试),然后选择  OK  ,出现下

一个选择面板,选择  An empty dll project.  ,然后直接点   Finish   ,工程新建完毕。

环境准备:找到Java的安装目录下的 include目录(路径参照 D:/Program Files/Java/jdk1.6.0_20/include/ )将这个目录下的全部文件复制到VC6.0的安装目录下的 include目录下(路径参照 D:/Program Files/Microsoft Visual Studio/VC98/Include/ ),然后将D:/Program Files/Java/jdk1.6.0_20/include/ win32下的内容再复制到D:/Program Files/Microsoft Visual Studio/VC98/Include/下(这里出现了双份的jawt_md.h和jni_md.h拷贝,编译的事情,这里不具体研究,出问题再说),这些完成后,把Java代码准备时生成的DLL头文件 HelloNative.h 添加到上一步新建的DLL工程中,然后再新建一个DLL程序文件 HelloNative.c

HelloNative.c

#include "HelloNative.h"

#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl)

{  

 printf("Hello Native World!/n");

}

新建完成后,执行 Build  --->  Build  HelloNative.dll (或者按F7) 生成测试用的DLL文件

然后将DLL文件拷贝到测试用Java程序的执行类(*.class)所在文件下,这个练习是放到HelloNative.class和HelloNativeTest.class所在目录下,然后进入DOS窗口,执行 java HelloNativeTest(回车),就可以看到输出结果了。

 


 


如果是在MyEclipse工程中,需要进行下述操作:

将VC工程生成的DLL文件放到工程 bin目录下,这个练习是将 HelloNative.dll 放到 bin 目录下。

找到菜单  Run   --->   Open Run Dialog...   --->  Java Application(选项卡)    ,在这个选项下边,会有对应于要调用DLL工程的一个选项,点进这个选项,在详细设定面板中选择   (x)=Arguments 这个选项卡,在里有一个文本输入的项目叫 VM arguments  ,在里面输入       " -Djava.library.path=E:/JavaWork/nativeInterfaceCall/bin"      ,然后点  Run 按钮,然后就可以执行程序了。

 

注意,这里的" -Djava.library.path=E:/JavaWork/nativeInterfaceCall/bin",不能在程序中用System.Setproperty()设定,因为java.library.path这个属性只在JVM启动的时候读取一次,所以,程序中的任何相关设定都是不起作用的。

HelloNative.java 这种中间类不能放在包里面,就是不能指定package。

 

调用带字符串参数的DLL
带字符串参数的DLL调用必须借助每三方接口,确切的说,就是在要调用的DLL上再加一层接口,下述说明参照。

上述使用例程修正如下:

HelloNative.java

public class HelloNative {

//这里对应的DLL接口定义为void greeting(char *str),这么定义是因为Java和C使用的是不同的字符集标准

//C是ANSI,Java是UTF-16(这个我也是查资料,没弄的太明白,可能有误,不过基本是这么个意思)

public native static void greeting(byte[] str,int strLength);

 static

 {

 System.loadLibrary("HelloNative");

 }

}

参照无参的HelloNative.java的说明,生成HelloNative.h头文件。

HelloNativeTest.java

class HelloNativeTest
{  
   public static void main(String[] args)
   {  
   String str = new String("Hello Native World!/n");
      new HelloNative().greeting(str.getBytes(),str.length());
   }
}

参照无参例子,新建动态链接库工程,生成DLL文件,然后将DLL放到system32下,放到别的地方也可以,不过要将你放的路径设置到系统环境变量 path 里,这样就不用运行Java的时候,总是去设定 java.library.path 这个JVM属性了。到这里,生成的是可以供windows调用的DLL。下面是参照代码:

 

如果是编译位于包路径下的中间件接口,使用如下格式命令

生成类文件:javac xxx.java

生成编译DLL所需头文件:javah -jni -classspath 包路径。类名(com.XXX.util.xxx)

 

转自:

http://51170526.blog.163.com/blog/static/73633350201052452742369/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值