JNA代码在OSx中工作正常,但无法从C共享对象文件中查找Linux中的函数

时间:2017-07-28 06:14:00

标签: java c jna

我正在使用以下示例:https://github.com/caplin/jnijnaexamples/tree/master/jna

在mac 中,我可以按如下方式创建.dylib文件:

  

gcc -shared -fpic -o librandomjna.o randomjna.c

     

g ++ -dynamiclib -undefined suppress -flat_namespace * .o -o librandomjna.dylib

     

mkdir课程

     

javac -d classes -classpath jna-4.4.0.jar JavaNativeAccess.java

     

cd classes

     

export LD_LIBRARY_PATH =。

     

java -classpath jna-4.4.0.jar:。 com.enlightedinc.apps.where.utils.JavaNativeAccess

在OSx中,它按预期工作,并能够执行C函数list_files

现在在Linux Box 中,我创建了.so文件,如下所示

  

gcc -shared -fpic -o librandomjna.o randomjna.c

     

gcc -shared -o librandomjna.so * .o

     

以同样的方式,在Linux mkdir类中生成新类

     

javac -d classes -classpath jna-4.4.0.jar JavaNativeAccess.java

     

cd classes

     

export LD_LIBRARY_PATH =。

     

java -classpath jna-4.4.0.jar:。   com.enlightedinc.apps.where.utils.JavaNativeAccess

现在,当我尝试在此Ubuntu框中执行代码时,出现以下错误 Exceptionjava.lang.UnsatisfiedLinkError:查找函数时出错' randomNumber':./ librandomjna.so:undefined symbol:randomNumber

  • 什么可能出错?
  • .dylib和.so文件之间的区别是什么?
  • 为什么.dylib(mac osx)可以解析所有函数调用,而.so文件(linux)无法查找函数?

任何帮助都将受到高度赞赏。

由于 卡尼斯卡

2 个答案:

答案 0 :(得分:0)

首先,请尝试以下操作:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:.

然后,确保您的so文件包含您期望的内容

nm librandomjna.so | grep rand

答案 1 :(得分:-1)

最后,我通过直接从.c文件

生成.so文件解决了这个问题

gcc -shared -fpic -o librandomjna.so randomjna.c

现在.so文件包含所有符号。