java怎么读取某个dll文件的内容
- 提问者网友:刪了回忆、却刪不了痛
- 2021-12-15 20:25
- 五星知识达人网友:孤久则安
- 2021-12-15 21:07
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
- 1楼网友:葬她心田
- 2021-12-15 22:40
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,发现里面有两个方法: jniexport jint jnicall java_testdll_getvalue (jnienv *, jobject);
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