java 调用第三方 动态库

[code="java"]
public class TestJava{
{
System.loadLibrary("test");
}
public native int add(int a,int b);

    public static void main(String argvs[])
    {

            TestJava ts=new TestJava();
            System.out.println(ts.add(4,5));
    }

}

[/code]
c++ test.h
[code="c++"]
#ifndef TEST_H
#define TEST_H
int add (int a,int b)
#endif
[/code]

test.cpp
[code="c++"]

#include "test.h"

int add (int a,int b)
{
return a+b;
}

[/code]
编译libtest.so
g++ -fPIC -shared test.cpp -olibtest.so

编译运行java
javac TestJava.java
java TestJava

报错如下:

Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJava.add(II)I
at TestJava.add(Native Method)
at TestJava.main(TestJava.java:11)
这个什么原因,请指教。

4个回答

用法错误,根据JNI 官方提供的文档,使用JNI调用第三方动态库需要 用javah编译生成头文件,根据这个头文件编译生成动态库才能调用成功,如果单纯调用第三方库的话推荐使用JNA 或者jnative这些都是可以的

代码有问题吧
[code="java"]public class TestJava{
static {
System.loadLibrary("test");
}
public native int add(int a,int b);

    public static void main(String argvs[])
    {

            TestJava ts=new TestJava();
            System.out.println(ts.add(4,5));
    }

}

[/code]

f980548079
f980548079 按照你这样写结果还是 Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJava.add(II)I at TestJava.add(Native Method) at TestJava.main(TestJava.java:11)
大约 6 年之前 回复

兄弟动态库,有加载进去吗?你动态库加载的路径对吗?

f980548079
f980548079 动态库已经加载上了路径没有问题
大约 6 年之前 回复

java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib

这样的错误信息,那么是因为MRChkLib.dll没有拷贝到windows的System32目录下. (MRChkLib.dll是加密锁的JAVA接口文件,文件在报表安装目录DogDriver/JavaAPI下可以找到) 并且要注意PATH环境变量中要包含System32目录。(如果服务器操作系统是Linux,那么使用报表安装目录DogDriver/JavaAPI 下的libMRChkLib.so文件,将libMRChkLib.so复制到WebServer的启动bin目录。如果在这个目录下仍然出现can not load library错误,请设置系统环境变量LD_LIBRARY_PATH的值为libMRChkLib.so所在的目录。
例如:如果libMRChkLib.so在/somedir目录下,则 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/somedir)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐