您当前的位置:首页 > 互联网教程

java 调用so文件

发布时间:2025-05-23 21:58:57    发布人:远客网络

java 调用so文件

一、java 调用so文件

1、public staticvoid main(String[] args)

2、System.loadLibrary("HelloWorld");

3、注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码段的System.loadLibrary调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。

4、在当前文件夹编译生成HelloWorld.class。

5、在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码:

6、/* DO NOT EDIT THIS FILE- it is machine generated*/

7、/* Header for class HelloWorld*/

8、JNIEXPORT void JNICALL Java_HelloWorld_print

9、该文件中包含了一个函数Java_HelloWorld_print的声明。这里面包含两个参数,非常重要,后面讲实现的时候会讲到。

10、创建HelloWorld.c文件输入如下的代码:

11、Java_HelloWorld_print(JNIEnv*env, jobject obj)

12、注意必须要包含jni.h头文件,该文件中定义了JNI用到的各种类型,宏定义等。

13、另外需要注意Java_HelloWorld_print的两个参数,本例比较简单,不需要用到这两个参数。但是这两个参数在JNI中非常重要。

14、env代表java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接口来转换成C类型的,就是通过调用env方法来完成转换的。

15、obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通过操作这个对象来完成。

16、在Linux下执行如下命令来完成编译工作:

17、cc-I/usr/lib/jvm/java-6-sun/include/linux/

18、-I/usr/lib/jvm/java-6-sun/include/

19、-fPIC-shared-o libHelloWorld.so HelloWorld.c

20、在当前目录生成libHelloWorld.so。注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h。

21、另外一个值得注意的是在HelloWorld.java中我们LoadLibrary方法加载的是

22、“HelloWorld”,可我们生成的Library却是libHelloWorld。这是Linux的链接规定的,一个库的必须要是:lib+库

23、名+.so。链接的时候只需要提供库名就可以了。

24、大功告成最后一步,验证前面的成果的时刻到了:

25、如果你这步发生问题,如果这步你收到java.lang.UnsatisfiedLinkError异常,可以通过如下方式指明共享库的路径:

26、java-Djava.library.path='.' HelloWorld

27、当然还有其他的方式可以指明路径请参考《在Linux平台下使用JNI》。

28、我们可以看到久违的“Hello world!”输出了。

二、后端| Java利用JNI调用C++(dll/so)函数

1、在后端开发中,Java通过JNI技术实现了与C++(包括dll和so文件)的高效交互,这使得Java程序能利用C++的强大功能扩展其性能。JNI,即Java Native Interface,为Java与非Java语言的交互提供了一套标准接口。

2、首先,你需要创建Java本地接口(JNI Interface),这通常包含你想要在Java中调用的C++函数的声明。

3、接着,你需要在C++代码中实现这些接口,包括编写实际的函数实现以及处理与Java的通信。

4、加载dll或so文件,这是通过JNI的LoadLibrary函数完成的,之后可以找到并调用其中的C++方法。

5、在Windows平台上,比如使用Visual Studio 2010专业版,你可以在Win7系统中实践这一过程。具体操作包括创建Java类,定义本地方法,然后在C++项目中编译生成相应的DLL或SO文件。

6、完成上述步骤后,你可以在Java代码中通过JNI的call*系列函数,如callVoidMethod,调用C++函数,并处理返回结果或传递参数。这将为你提供一个强大的工具,让Java和C++代码在同一个进程中无缝协作。

三、linux环境java如何调用so文件

1、public staticvoid main(String[] args)

2、System.loadLibrary("HelloWorld");

3、注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码段的System.loadLibrary调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。

4、在当前文件夹编译生成HelloWorld.class。

5、在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码:

6、/* DO NOT EDIT THIS FILE- it is machine generated*/

7、/* Header for class HelloWorld*/

8、JNIEXPORT void JNICALL Java_HelloWorld_print

9、该文件中包含了一个函数Java_HelloWorld_print的声明。这里面包含两个参数,非常重要,后面讲实现的时候会讲到。

10、创建HelloWorld.c文件输入如下的代码:

11、Java_HelloWorld_print(JNIEnv*env, jobject obj)

12、注意必须要包含jni.h头文件,该文件中定义了JNI用到的各种类型,宏定义等。

13、另外需要注意Java_HelloWorld_print的两个参数,本例比较简单,不需要用到这两个参数。但是这两个参数在JNI中非常重要。

14、env代表java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接口来转换成C类型的,就是通过调用env方法来完成转换的。

15、obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通过操作这个对象来完成。

16、在Linux下执行如下命令来完成编译工作:

17、cc-I/usr/lib/jvm/java-6-sun/include/linux/

18、-I/usr/lib/jvm/java-6-sun/include/

19、-fPIC-shared-o libHelloWorld.so HelloWorld.c

20、在当前目录生成libHelloWorld.so。注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h。

21、另外一个值得注意的是在HelloWorld.java中我们LoadLibrary方法加载的是

22、“HelloWorld”,可我们生成的Library却是libHelloWorld。这是Linux的链接规定的,一个库的必须要是:lib+库

23、名+.so。链接的时候只需要提供库名就可以了。

24、大功告成最后一步,验证前面的成果的时刻到了:

25、如果你这步发生问题,如果这步你收到java.lang.UnsatisfiedLinkError异常,可以通过如下方式指明共享库的路径:

26、java-Djava.library.path='.' HelloWorld

27、当然还有其他的方式可以指明路径请参考《在Linux平台下使用JNI》。

28、我们可以看到久违的“Hello world!”输出了。