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

今天天气不错啊 发布于 2018/10/30 14:54
阅读 422
收藏 0

我是按照。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

请问下大神 该怎么解决。 

加载中
0
今天天气不错啊
今天天气不错啊

还是先把它拷贝到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 错误。。

0
今天天气不错啊
今天天气不错啊
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文件都加载

0
yysf
yysf

c++ 的头文件呢?? 函数是否导出 另外后缀.so 应该也可以不加的吧。我没有测试过

是否添加extern "C"

今天天气不错啊
今天天气不错啊
谢谢帮助。对,so可以不加的(我上面写错了) 头文件是.h文件吗 (类似Java 的interface吗),.h文件有的,不过没有拷贝到linux-86-64. extern "C" 是在哪里查看的?(在.h文件内 没有搜索到extern)
0
吕兵阳
吕兵阳
直接给个dll不行吗?
今天天气不错啊
今天天气不错啊
因为最后还是要在linu下的,不知道有没有dll,所以就想自己用so文件先做做看。
0
今天天气不错啊
今天天气不错啊

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

0
今天天气不错啊
今天天气不错啊

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

返回顶部
顶部