linux上jna读取so1002无标题,Linux下JNA 调用 so 库

最近自己写的一个广告发布平台要迁移到Linux平台上,由于之前用的是windows平台的dll文件,现在要改用.so。讲下如何在Linux下面调用.so。

在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件

1、写一个简单test.c文件:

#include

int add(int a,int b);

int add(int a,int b)

{

int c = a + b ;

return c ;

}

2、编译为so动态链接库:

gcc -fpic -c test.c

gcc -shared -o libtest.so test.o

ls看一下生成的文件:

libtest.so test.c test.o

这样就会生成so文件了。 这里为什么要命名为libtest.so而不是test.so呢?因为jna在找so文件的时候,要匹配前缀为lib的so文件

3、接下来开始写java文件(需要下载jna.jar),我们写一个TestSo.java:

import com.sun.jna.Library;

import com.sun.jna.Native;

public class TestSo {

public interface LgetLib extends Library {

// 调用linux下面的so文件,注意,这里只要写test就可以了,不要写libtest,也不要加后缀

LgetLib INSTANCE = (LgetLib) Native.loadLibrary("test",LgetLib.class);

int add(int a,int b);

}

public int add(int a,int b){

return LgetLib.INSTANCE.add(a,b);

}

public static void main(String[] args) {

TestSo ts = new TestSo();

int c = ts.add(10,20);

System.out.println("10+20="+c);

}

}4、 接下来进行编译:

export CLASSPATH=$CLASSPATP:./jna.jar //这里是设置环境变量

javac TestSo.java

这里直接运行TestSo的话:

java TestSo

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'test': libtest.so: cannot open shared object file: No such file or directory

at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)

at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)

at com.sun.jna.Library$Handler.(Library.java:140)

at com.sun.jna.Native.loadLibrary(Native.java:379)

at com.sun.jna.Native.loadLibrary(Native.java:364)

at TestSo$LgetLib.(TestSo.java:7)

at TestSo.add(TestSo.java:11)

at TestSo.main(TestSo.java:15)

这个错误是指找不到so文件。于是我们将so文件所在的目录设置到环境变量LD_LIBRARY_PATH中:

vim /etc/profile

在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC下面加入

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${你的so目录}

之后,你可以检查一下设置的起没起效果:echo $LD_LIBRARY_PATH,如果出现你设置的内容就对了,如果没有,你可以重新打开一个窗口再查一下

设置好环境变量之后,你就可以运行java类了:

java TestSo

10+20=30

到此运行成功。

如果你遇到了紧急的情事,而这个地方又搞不定,你可以暂时交so文件放到/usr/lib这个目录下面,一般是可以使程序运行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在嵌入式环境中,JNA无法链接到`.so`文件,可能是由于以下原因导致的: 1. 确保`.so`文件存在且位于正确的位置。你可以使用命令行检查该文件是否存在: ```shell ls /path/to/your/library.so ``` 如果文件不存在,请确认你是否正确安装了该,并将其放置在正确的目录下。 2. 检查链接路径是否正确设置。在嵌入式环境中,可能需要手动设置链接的路径。你可以使用`System.setProperty()`方法来设置`jna.library.path`属性,将链接路径指定为你的链接所在的目录。例如: ```java System.setProperty("jna.library.path", "/path/to/your/library"); ``` 注意:这个属性应该在程序启动之前设置。 3. 检查链接文件的权限。确保你的应用程序具有访问链接文件的权限。你可以检查文件的权限设置,并确保应用程序在运行时具有读取权限。 4. 如果上述方法仍然无法解决问题,可能是由于链接与目标平台不匹配导致的。确保链接与目标平台的架构和操作系统版本一致。 5. 如果你在使用IDE(如Eclipse、IntelliJ等),请确保将链接文件添加到项目的构建路径中。将`.so`文件复制到项目中,并确保构建配置正确。 6. 在Linux系统中,你也可以尝试使用`LD_LIBRARY_PATH`环境变量来指定链接路径。例如,在命令行中运行你的Java程序之前,可以设置`LD_LIBRARY_PATH`环境变量: ```shell export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH java YourProgram ``` 将`/path/to/your/library`替换为你的链接所在的目录。 请根据你的具体情况尝试上述解决方案。如果问题仍然存在,请提供更多细节,以便我可以给出更具体的建议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值