Centos中用jna调用.so文件详细过程(.so文件嵌套调用.so文件)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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,显示结果。


猜你喜欢

转载自blog.csdn.net/chanshibing/article/details/75050252