Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNA代码在OSx中运行良好,但无法在Linux中从C共享对象文件查找函数_Java_C_Jna - Fatal编程技术网

Java JNA代码在OSx中运行良好,但无法在Linux中从C共享对象文件查找函数

Java JNA代码在OSx中运行良好,但无法在Linux中从C共享对象文件查找函数,java,c,jna,Java,C,Jna,我正在使用以下示例: 在mac中,我可以创建.dylib文件,如下所示: gcc-shared-fpic-o librandomjna.o randomjna.c g++-dynamiclib-undefined suppress-flat_名称空间*.o-o librandomjna.dylib mkdir类 javac-d classes-classpath jna-4.4.0.jar JavaNativeAccess.java cd类 导出LD_库_路径= java-classpath j

我正在使用以下示例:

在mac中,我可以创建.dylib文件,如下所示:

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

g++-dynamiclib-undefined suppress-flat_名称空间*.o-o librandomjna.dylib

mkdir类

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

cd类

导出LD_库_路径=

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

在OSx中,它按预期工作,能够执行C函数列表文件 现在在Linux框中,我创建了.so文件,如下所示

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

gcc-共享-o librandomjna.so*.o

同样,在Linux mkdir类中生成新类

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

cd类

导出LD_库_路径=

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

现在,当我尝试执行这个Ubuntu框中的代码时,我得到以下错误 例外java.lang.UnsatifiedLinkError:查找函数“randomNumber”时出错:/librandomjna.so:未定义符号:randomNumber

  • 有什么可能出错
  • .dylib和.so文件之间有什么区别
  • 为什么.dylib(mac osx)可以解析所有函数调用,而.so文件(linux)无法查找函数
我们将非常感谢您的帮助

谢谢
迦腻色迦

首先,尝试以下方法:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:.
然后,确保so文件包含您期望的内容

nm librandomjna.so | grep rand

最后,我通过直接从.c文件生成.so文件解决了这个问题

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


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

如果您还没有决定是使用JNI还是JNA,请看这里以熟悉JNI:BTW-当您克隆repo并运行时会发生什么?它应该是开箱即用的。JNI对我不起作用,因为我在实际项目中没有访问c文件的权限,我只能访问.o/.a/.so文件,所以我尝试了JNA,现在它在生成.so文件后可以正常工作。直接从.c代码我已经设置了>ld_library_路径,是的。so文件缺少符号,因为它是从.o文件生成的。现在我正在生成.so文件,直接从.c文件,正常工作,谢谢。