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 展开
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 展开
2个回答
展开全部
调用C++编译的代码能调用到库但是找不到函数,应该是因为C++编译器会破坏函数的名称。
对此,一般网上能查到两种方法解决:
用extern C ,功能是将部分代码用C编译器进行编译,因为 C编译器不会改变函数的函数名,Java中就可以用代码中的函数名调用了。
用def模板
注1:这里说的方法你需要自己去查一下,别人的文章会写得比较清楚,看完整的文章能学到更多。
注2: 对于C和C++编译器对函数名的影响,这里和你说一下如何查看:你想看看C++编译器编译的DLL的方法名可以用depends反编译程序,把dll拖进depends程序窗口,左边会有依赖树,点击最顶端你的“库名.dll”,右边就能看到dll中函数被C++编译之后的名字。如下图:
用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);
}
}
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);
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询