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 咋弄?的主要内容,如果未能解决你的问题,请参考以下文章