已有C++ lib的so文件 .h文件, 怎么在linux下 以 java Demo 运行 并调用C++代码。 JNA方式。
我是按照。https://www.cnblogs.com/lanxuezaipiao/p/3635556.html 上的做的。
本地windows没有C++ 的dll文件,测试不了,想写个简单的类,看看能不能调用C++ 的代码。
下载了第三方的JNA-4.1.0 jar包 ,写了个Demo.java .
import com.sun.jna.Library; import com.sun.jna.Native; public class Demo { public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary("demo.so", CLibrary.class); boolean compare(String key,String value); } public static void main(String[] args) { boolean flag = CLibrary.INSTANCE.compare("100","200"); System.out.println(flag); } }
.so文件 .h文件 .class 文件 .java 文件 都在 /home/tmp 文件夹下。
编译是 javac -cp jna-4.1.0.jar Demo.java
执行 : java -cp jna-4.1.0.jar Demo 报错:错误: 找不到或者无法加载主类 Demo
执行: java Demo 报错 :Exception int thread "main" .... NoClassDefFoundError : com/sun/jna/Library
请问下大神 该怎么解决。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
问题解决了。如果刚好遇到问题的你,也不会JNI/JNA,不会C,但是又找不到解决方法。请去虚心请教写C的同事(比如提供.so文件 给你调用的) ,请他/她 帮忙,合力解决,可能是方法名错了,可能是多了个下划线,可能是load加载的路径不对等等。 我是脸皮比较薄的,不好意思开口,但是要相信同事,其实都是挺热情友善的。
C给我的是.so 文件,之前好像没有加什么extern 声明。 现在改成了JNI调用(实在不懂这两个)。现在倒是没有报上面这个错,却报了其他错误:java.lang.UnsatisfiedLinkError: cn.Demo.....XXX.yyMethod() (L.java/lang/String;L.java/lang/String;)I 错误。
因为最后还是要在linu下的,不知道有没有dll,所以就想自己用so文件先做做看。
直接给个dll不行吗?
这句前面不能加 "lib", 比如 so文件全名为 “libdemo.so” 代码里得写 demo.so .上面这局是对的, 但是我实际代码里写的是 libdemo.so 所以 它一直找不到 这个文件,报错 是 linux-x86-64/liblibdemo.so 文件名多了 "lib" 。
不过,又报错了,"Error looking up function 'compare' ... undefined symbol " 是说 在so文件里找不到这个函数? 可能加载一个so还不够,得把所有的so文件都加载
还是先把它拷贝到Controller里试试。 .so文件放置在 WEB-INF/classes 目录下的 linux-x86-64 文件夹下面。
报错: NoClassDefFoundError: Could not initialize class com...controller.TestController$CLibrary 错误。。