javadll,javadll缺失

本文目录一览:

java加载dll文件

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

如何解决java调dll报Unable to load library的错误

解决java调dll报Unable to load library的错误可以尝试以下方法:

载入库文件有两个函数,System.load 和 System.loadLibrary。

当使用System.load时,需要输入文件的全路径,例如:System.load(“/tmp/test.so”);

当使用System.loadlibrary时是在系统的library 的目录中需找复合条件的库文件,可以使用-Djava.library.path=[path]参数,来指定Java程序加载库文件的路径,或者将库文件(*.so,*.dll)复制到include的默认路径,Linux一般是/usr/lib目录下,当然你可以编辑/etc/ld.so.conf.d/下的文件,设定自己的库查找路径ldconfig -v|grep xxx看看有没有你的动态库。

Linux还要注意,使用System.loadLibrary(name)方法其中参数内容与Windows有区别,Linux中的的库文件名为libname.so,Windows为name.dll。

在Windows中尽量使用Windows的C/C++编译器生成dll文件,否则会出现问题。

不过具体问题还要具体对待!

java调用dll,如何传入指针变量

问题解答:

1Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间

2.整形的数据可以直接传入;

3.JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成的字符指针;

4.输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。

java 调用C写的DLL

 一、 生成C的头文件

1. 编辑Main.java

public class Main

{

public native static int getStrNum(byte str[], int strLen);

}

2. 生成头文件

按win + r打开“运行”窗口,输入“cmd”,打开DOS控制台窗口。进入上面Main.java所在的目录中,输入:

javac Main.java

javah Main

两条命令完成后会生成Main.h文件

二、 生成DLL

1. 新建空工程

在VS中新建工程:Win32 Console Application,取名“MakeDLL”,选择空工程。新建后修改工程属性:

(1) General中,将“Configuration Type”改为“Dynamic Library (.dll)”;

(2) C/C++的General中,将“Additional Include Directories”添加两项:

“C:Program FilesJavajdk1.5.0_06include”

“C:Program FilesJavajdk1.5.0_06includewin32”

根据你安装的JAVA路径而设置,这是因为在C/C++编译过程中要使用JAVA的jni.h等文件

2. 将上面生成的Main.h添加入工程

3. 新建一个新的文件main.cpp,代码如下:

#include ’Main.h’

#include ’string.h’

JNIEXPORT jint JNICALL Java_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)

{

jbyte *buffer = (*env).GetByteArrayElements(str, 0);

buffer[strLen] = ’’; // 由于JAVA自动分配空间,需要传进来字符串长度参数

jint len = strlen((char*)buffer);

return len;

}

4. 按F7编译链接,生成MakeDLL.dll文件

三、 JAVA调用DLL

在JAVA中使用上面生成的DLL文件:

1. 将MakeDLL.dll复制到与使用DLL的JAVA文件相同的目录下。

2. JAVA文件的源代码:

public class Main

{

static

{

System.loadLibrary(’MakeDLL’);//加载资源文件MakeDLL.dll

}

public native static int getStrNum(byte str[], int strLen);

public static void main(String[] args)

{

Main instance = new Main();

String str = new String(’haha’);

int num = instance.getStrNum(str.getBytes(), str.length());

System.out.println(num);

}

}

java 如何调用dll?

JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

简单介绍及应用如下:

一、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++程序调用来生成所需的库文件。

二、C/C++中所需要做的工作

对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。

接上例子。我们先看一下testdll.h文件的内容:

#i nclude jni.h

#ifndef _Included_testdll

#define _Included_testdll

#ifdef __cplusplus

extern “C” {

#endif

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);

#ifdef __cplusplus

}

#endif

#endif

在具体实现的时候,我们只关心两个函数原型

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);

这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。

好,下面我们用testdll.cpp文件具体实现这两个函数:

#i nclude “testdll.h”

int i = 0;

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)

{

return i;

}

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)

{

i = j;

}

编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。

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

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/242245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:47
下一篇 2024-12-12 12:47

相关推荐

  • Python缺失值填充

    在处理数据时,经常会遇到数据缺失的情况,这时候就需要使用填充方法来处理缺失值。Python提供了多种缺失值填充的方法,本文将从多个方面进行阐述。 一、Python缺失值填充为0 在…

    编程 2025-01-14
  • 「主清单属性缺失」是Java程序中常见的错误,解决方法大揭秘!

    在Java程序中,「主清单属性缺失」是一种非常常见的错误。当我们在使用Java打包工具时,如果主清单文件(MANIFEST.MF)中某些必要的属性缺失,就会导致程序无法正常运行。本…

    编程 2025-01-07
  • 使用php的curl库,php库缺失 curl

    本文目录一览: 1、PHP使用curl的问题? 2、PHP语言中php curl的几种应用方式 3、PHP_CURL使用详解 4、PHP如何开启curl 5、php curl的几种…

    编程 2024-12-28
  • dwg导出pdf失败,dwg打印pdf缺失

    本文目录一览: 1、CAD转PDF生成不了文件? 2、cad导出pdf导不出来显示正在创建pdf 3、dwg转pdf文件过大不能转换 4、为什么cad转换pdf转换不了 5、dwg…

    编程 2024-12-26
  • 我的世界怎么json文件(我的世界json文件缺失)

    本文目录一览: 1、我的世界Json指令详解 怎么使用Json指令制作悬浮彩字 2、我的世界整合包1.12.2缺少json文件 3、我的世界创背json怎么整合 4、玩我的世界说J…

    编程 2024-12-19
  • 包含处理缺失值的python代码的词条

    本文目录一览: 1、缺失值处理 2、python中利用pandas怎么处理缺省值 3、如何使用Python 对缺失值进行处理 4、python填充缺失值 缺失值处理  缺失数据  …

    编程 2024-12-15
  • 运行时错误424:对象所需的内容缺失

    运行时错误424是编写VBA代码时最常见的错误之一。它表明您正在尝试使用不存在的对象,或者您正在尝试访问该对象的内容,但该对象需要的内容已经丢失了。这个错误值得我们仔细探讨。 一、…

    编程 2024-12-12
  • dwg打印pdf缺失,dwg打印存为pdf

    本文目录一览: 1、cad打印pdf显示不全的问题解答~!~! 2、PDF 图纸打印出来显示不全,电脑里显示正常 3、CAD打印成PDF后字体重叠部分文字丢失 cad打印pdf显示…

    编程 2024-12-12
  • 如何有效处理数据集中的缺失值

    数据集中的缺失值是指数据集中某些变量或者属性的取值为空或者未知,这种情况在数据挖掘和机器学习中经常会遇到。在进行数据挖掘和机器学习时,缺失值会对结果产生负面影响,因此需要有效地处理…

    编程 2024-12-11
  • 关于python画图实线缺失值结束的信息

    本文目录一览: 1、python中利用pandas怎么处理缺省值 2、python填充缺失值 3、python dataframe 如何去除缺失值 python中利用pandas怎…

    编程 2024-12-07

发表回复

登录后才能评论