版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chanshibing/article/details/75050252
写出本文,作者本人也是花去了一些时间的,在摸索的过程中遇到了很多问题,然后通过度娘来解决这些问题,最后进行一下的这些总结。我是一个linux新手,只是在做项目的过程遇到了这个问题,就将它记录下来,分享给大家。如有错误,请大家指正,谢谢!
1、首先当然是需要搭建Java环境和安装gcc,这个过程百度一搜一大把
2、生成第一个.so文件libtest1.so
(1)先写一个简单的test1.h头文件:
选择一个路径下,输入命令gedit test1.h
int add(int a, int b);
(2)再写一个test1.c文件:
#include "test1.h" int add(int a, int b){ return a + b; }
(3)生成test1.o文件:
当前路径下输入命令gcc -fpic -c test1.c
(4)生成libtest1.so文件:
输入命令gcc -shared -o libtest1.so test1.o
3、生成另一个.so文件libtest2.so,去调用libtest1.so文件
(1)写一个test2.c文件:
# include"test1.h" int result(); int result(){ return add(20, 20); }
要包含test1.h头文件
(2)生成test2.o文件:
输入命令gcc -fpic -c test2.c
(3)生成libtest2.so文件,并且将libtest1.so加入依赖项:
输入命令gcc -shared -o libtest2.so test2.so -L ./ -ltest1(./表示libtest1.so文件的路径,就是当前路径;-ltest1表示的是libtest1.so文件)
(4)检测依赖是否成功:
输入命令objdump -x libtest2.so | grep NEEDED
如上图所示,就表明依赖成功。如果没有依赖成功,可能是因为文件路径问题。
4、到网上下载一个jna.jar文件
将jna-4.4.0.jar文件放到一个路径下,后面需要将这个路径添加到变量CLASSPATH中,本文的路径是/home/chan/Desktop/testJna/lib/jna-4.4.0jar
5、接下来就可以开始写java文件了
(1)写一个java文件testSo.java
import com.sun.jna.Library; import com.sun.jna.Native; public class testSo{ public interface testSOInterface extends Library{ public int result(); testSOInterface INSTANCE = (testSOInterface)Native.loadLibrary("test2", testSOInterface.class); } public static void main(String[] args){ System.out.println(testSOInterface.INSTANCE.result()); } }
(2)编译testSo.java文件输入命令javac testSo.java,如果遇到下面问题:
就是缺少第四步所说的配置变量CLASSPATH,输入命令:export CLASSPATH=$CLASSPATH:/home/chan/Desktop/testJna/lib/jna-4.4.0.jar通过echo $CLASSPATH命令可以查看是否配置成功要是出现下面这个问题:
就可能是你的java文件不能找到需要调用的libtest1.so文件和libtest2.so文件,只要将libtest2.so文件的路径加入坏境变量PATH中即可,输入命令:export PATH=$PATH:/home/chan/work/so(本文的so库存放的路径)
(3)执行class文件输入命令java testSo,显示结果。