已有C++ lib的so文件 .h文件, 怎么在linux下 以 java Demo 运行 并调用C++代码。 JNA方式。

发布于 2021-12-01 18:32:30 字数 1031 浏览 922 评论 6

我是按照。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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

草莓味的萝莉 2021-12-08 13:21:35

问题解决了。如果刚好遇到问题的你,也不会JNI/JNA,不会C,但是又找不到解决方法。请去虚心请教写C的同事(比如提供.so文件 给你调用的) ,请他/她 帮忙,合力解决,可能是方法名错了,可能是多了个下划线,可能是load加载的路径不对等等。 我是脸皮比较薄的,不好意思开口,但是要相信同事,其实都是挺热情友善的。

无边思念无边月 2021-12-08 13:21:28

C给我的是.so 文件,之前好像没有加什么extern 声明。 现在改成了JNI调用(实在不懂这两个)。现在倒是没有报上面这个错,却报了其他错误:java.lang.UnsatisfiedLinkError: cn.Demo.....XXX.yyMethod() (L.java/lang/String;L.java/lang/String;)I 错误。

伪装你 2021-12-08 13:19:35

因为最后还是要在linu下的,不知道有没有dll,所以就想自己用so文件先做做看。

落墨 2021-12-08 13:16:39

直接给个dll不行吗?

平生欢 2021-12-08 12:55:02
CLibrary INSTANCE = (CLibrary)
            Native.loadLibrary("demo.so",
                               CLibrary.class);

这句前面不能加 "lib", 比如 so文件全名为 “libdemo.so” 代码里得写 demo.so   .上面这局是对的, 但是我实际代码里写的是 libdemo.so 所以 它一直找不到 这个文件,报错 是 linux-x86-64/liblibdemo.so 文件名多了 "lib" 。 

不过,又报错了,"Error looking up function 'compare'  ...  undefined symbol   "  是说 在so文件里找不到这个函数? 可能加载一个so还不够,得把所有的so文件都加载

初见你 2021-12-06 01:49:37

还是先把它拷贝到Controller里试试。 .so文件放置在 WEB-INF/classes 目录下的  linux-x86-64 文件夹下面。

@Controller
@RequestMapping("/")
public class TestController {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
            Native.loadLibrary("demo.so",
                               CLibrary.class);

        boolean compare(String key,String value);
    }

    @RequestMapping(value="test",method=Requestmethod.GET)
    public Boolean test(){
        boolean flag = CLibrary.INSTANCE.compare("100","200"); 
        System.out.println(flag);
        return flag;
    }

}

报错: NoClassDefFoundError: Could not initialize class com...controller.TestController$CLibrary 错误。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文