有个奇怪的现象,
我要调用 c 里边的 add()
,不知道是调用方法不对,还是怎么的。两种语言调用均提示函数找不到undefined symbol
如下代码。(函数是在libso.so
中,libso.so
依赖于libso1.so 、libso2.so
)
但是!! 但是!!!
我命令行执行: nm -D libso.so
显示的函数名是这种:_ZN11add4InERKSs
我用这个看似乱码的函数名_ZN11add4InERKSs
调用,居然调用成功了!!!而且用这个函数名 java
跟 python
均能调用成功,这是什么原因???求解释
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Java_call_c {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)Native.loadLibrary("so1",CLibrary.class);
CLibrary INSTANCE1 = (CLibrary)Native.loadLibrary("so2",CLibrary.class);
CLibrary INSTANCE2 = (CLibrary)Native.loadLibrary("so",CLibrary.class);
int add();
}
public static void main(String[] args) {
System.out.println(CLibrary.INSTANCE2.add());
}
}
1
enenaaa 2018-05-31 14:15:04 +08:00
这个 so 是用 c++写的吧。
函数声明加上 extern “ C ” |
3
enenaaa 2018-05-31 16:01:11 +08:00
这种函数名符号是 C++的 ABI 样式。 加了 extern "C" 还是这种的话,说明没加对。
|
5
GeruzoniAnsasu 2018-05-31 18:48:05 +08:00
|