java 读取DLL 咋弄?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 读取DLL 咋弄?相关的知识,希望对你有一定的参考价值。

java 读取DLL 咋弄?

一、建立java文件
注意点:1.要对dll里面的方法做本地声明
2.加载dll
示例代码:
public class testdll
static
System.loadLibrary("goodluck"); //注意:不写扩展名,名字要与dll的文件名一致

public native int getValue();
public native void setValue(int i); /**
* @param args
*/
public static void main(String[] args)
testdll test=new testdll();
test.setValue(10);
System.out.println(test.getValue());



二、编译
javac testdll.java ------如果没有错,进行下一步
javah testdll ------生成testdll.h这个头文件

三、实现步骤一中声明的方法
打开VC++6.0,建立一个dll空工程,把testdll.h导入工程中,新建一个test.cpp源文件
打开testdll.h,发现里面有两个方法:
/*
* Class: testdll
* Method: getValue
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject);/*
* Class: testdll
* Method: setValue
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint);

JNIEXPORT不用管,第二个单词jint/void是返回值,jint相当于int类型,JNICALL不用管,每一个方法名前都有前缀Java_testll_,前两个参数JNIEnv *和jobject不用管,第二个方法的第三个参数jint就是java文件里的int i。
上面有声明了,现在就要实现这两个方法,把代码补充进来吧:)
示例代码:
#include "testdll.h"
int i=0;
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject)
return i;

JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint j)
i=j;


四、编译
此时编译会出现error,主要是提示找不到jni.h(这个包含在testdll.h)里,需要我们把jni.h、jni_md.h复制到C:\Program Files\Microsoft Visual Studio\VC98\Include这个目录里(默认安装目录,如果安装VC不是这个目录,请自行找到Include目录)。
jni.h------------------jdk安装目录\include
jni_md.h------------jdk安装目录\include\win32
然后再编译,构建,就有了test.dll这个动态链接库文件了,把它重命名成goodluck.dll,然后复制到testdll.java的目录下,运行吧:)
java testdll
结果:
10
参考技术A 只能用JNI读取Dll文件JNI是Java Native Interface,也就是Java本地接口.可以通过JNI调用Window的DLL文件.但要遵循一定的规则.比如方法的命名要按照package_class_method名. 参考技术B 用文字流的方式进行读取

java加载dll文件

情况,目前有一个dll文件,但是dll文件里面是数据库表,请问,java怎么读取里面的数据,谢谢

参考技术A java没法直接读,只能先用C++写一个读取该dll内容的过程,按JNI规范封装成dll,然后java加载这个dll执行其中的函数。追问

现在本身就是一个dll,为什么还要再写一个呢?我用工具反编译了一下,的确此dll里面没有对应的函数什么的,C++也不会呀,请问我现在最好的处理方法是什么,谢谢!

追答

因为这个dll当中的函数不是按照JNI格式封装的,所以Java无法直接加载该dll。只能通过C++写的另一个dll再进行一次封装。

参考技术B java不能直接操作DLL 用Jna
你也不能直接操作DLL
你只能调用封装好的方法
一句话 你得按照DLL提供的方法取操作他追问

dll里面反编译过来没有函数,当然也有可能是我做的不正确,只晓得通过Navicat for sql可以直接加载该dll 而后就可以直接查看dll里面包含的数据。

追答

你不是用的sqllite哦 不是DLL Navicat for sql加载什么DLL

追问

这是真的,一开始我也不理解,但是通过工具的确加载出来了
工具就是这个Navicat for sqlite ;所以就有些搞不懂了,如果只是调用dll,晓得里面的方法的话 那还是很简单的,目前这个就是一个数据库,但是是以dll形式来的,就不晓得改怎么通过java把这个数据读取出来了。

追答

我都说了你那个不是DLL dll是动态链接库 你那个是sqlite 数据库
结尾一班是.db 不是.dll
百度 java操作sqlite 数据库 几下就解决你的问题

和你操作mysql 那些没什么区别 只是他是一个文本数据库

追问

就是这个文件,这就是dll的哇,直接改后缀?

追答

你改不改后缀他都是sqlite数据库 难道你把a.txt 改成B.DLL 你打开的内容不是和a.txt 一样的么 整好了 采纳一下

本回答被提问者采纳

以上是关于java 读取DLL 咋弄?的主要内容,如果未能解决你的问题,请参考以下文章

Java从串口读取数据

java excel怎么读取到html

在Delphi下,怎样在DLL里读取ini文件的内容

Java读取ID卡卡号源码

java加载dll文件

JAVA如何调用C语言编写的程序,并且传参数,读取返回结果?