loadlibrary在哪个头文件(loadlibrary 头文件)

http://www.itjxue.com  2023-02-13 14:36  来源:未知  点击次数: 

java中调用c语言函数

要在java中调用c语言的库,需要使用Java提供了JNI。

举例说明

在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.

现在分别从Java和C语言两部分说明:

1. Java 部分

首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:

public class HelloNative {

public native void sayHello();

}

编译这个类,生成class文件:

javac HelloWorld.java

利用javah生成需要的h文件

javah 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: sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloNative_sayHello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。

2. C语言部分

根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:

#include stdio.h

#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)

{

printf("Hello World!\n");

}

代码编写完成之后,我们再用gcc编译成库文件,命令如下;

gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp

这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.

接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");

public class TestNative

{

static {

try {

System.loadLibrary("HelloNative");

}

catch(UnsatisfiedLinkError e) {

System.out.println( "Cannot load hello library:\n " + e.toString() );

}

}

public static void main(String[] args) {

HelloNative test = new HelloNative();

test.sayHello();

}

}

但是再编译后,运行的时候,问题又出现了.

Cannot load hello library:

java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V

at HelloNative.sayHello(Native Method)

at TestNative.main(TestNative.java:13)

载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?

用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:

1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好

2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中

3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH

这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了

请问在VC++中能不能不添加windows.h,就调用loadlibrary()来加载dll,具体怎么操作,麻烦举个简单的例子。

driverspecs.h 是与设备有关的头文件。涉及到设备的程序比较麻烦。

这种程序你要用 Visual Studio 帮助建立程序框架,Visual Studio会安排与 DLL 有关的如何装入,调用,初始化等等。 stdafx.h 会考虑 与视窗有关的头文件。程序链接用 .lib,

运行时用 .dll

注意拼写: LoadLibrary , 不要漏 字母 r.

LoadLibrary 能载入有lib 的dll吗

首先,dll的调用不一定需要*.lib这个引入库。

dll调用分为两种方式,一是隐式链接,二是显式链接。隐式链接就是使用*.lib的,这就需要在编译的时候有这个lib文件。而显式链接,就是使用LoadLibrary这个API函数来实现动态加载,因此,不需要lib这样的引入库。

再者,就算是使用隐式链接,lib只是在编译的时候确定DLL接口,使得调用者可以很便捷地使用dll文件,但在发布的时候,是不需要连同lib一起发布。

如果你要发布一个dll形式的SDK,就很有必要将头文件,dll文件连同引入库一起发布,以方便使用者调用。

loadlibrary(“C:\windows\system32\richtx32.ocx")失败-找不到指定的模块

头文件 #include Winbase.h

函数原型是 HINSTANCE LoadLibrary( LPCTSTR lpLibFileName);

LoadLibrary ("C:\\windows\\system32\\richtx32.ocx"); 用双斜杠

查一下你的loadlibrary函数要求 -- 头文件,函数参数,链接哪个库。另外 richtx32.ocx 是否丢失了。

(责任编辑:IT教学网)

更多

推荐HTML/Xhtml文章