JNA 调用c++函数的出错,java能加载库,但是找不到c++写的函数 10

voidfunc(char*);这是c++的函数;jna接口中对应的函数为voidfunc(stringa);能加载so文件,但是找不到这个函数,报错如下:Excepti... void func(char*);这是c++的函数;
jna 接口中对应的函数为void func(string a);
能加载so文件,但是找不到这个函数,报错如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'func': /lib/libfunc.so: undefined symbol: func
c++源码的include和extern c这些地方是不是有些要注意的关键细节?
系统:ubuntu 14.04
展开
 我来答
No34小石
2019-04-02 · TA获得超过1175个赞
知道答主
回答量:39
采纳率:0%
帮助的人:23.4万
展开全部

调用C++编译的代码能调用到库但是找不到函数,应该是因为C++编译器会破坏函数的名称。

对此,一般网上能查到两种方法解决:

  1. 用extern C ,功能是将部分代码用C编译器进行编译,因为 C编译器不会改变函数的函数名,Java中就可以用代码中的函数名调用了。

  2. 用def模板

注1:这里说的方法你需要自己去查一下,别人的文章会写得比较清楚,看完整的文章能学到更多。

注2: 对于C和C++编译器对函数名的影响,这里和你说一下如何查看:你想看看C++编译器编译的DLL的方法名可以用depends反编译程序,把dll拖进depends程序窗口,左边会有依赖树,点击最顶端你的“库名.dll”,右边就能看到dll中函数被C++编译之后的名字。如下图:

  1. 用C编译的DLL:

2. 用C++编译的DLL:

匿名用户
2015-09-18
展开全部
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);
}
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式