【问题标题】:calling a c++ dll in java with loadLibrary()使用 loadLibrary() 在 java 中调用 c++ dll
【发布时间】:2014-10-22 12:14:37
【问题描述】:

我在用 Java 加载 c++ dll 时遇到问题。当我使用下面的 Java 代码(loadLibrary)时,我得到了这个错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJNI.Add(II)V

我该如何解决这个问题?

public class TestJNI {

   public native void Add(int a,int b);

   static {

      System.loadLibrary("dllclass");

   }

   public static void main(String args[]) {

          new TestJNI().Add(1,2);
       }
}

除了头文件,我没有c中的源代码,它使用这个代码

int APIENTRY(dllexport) add(int a, int b);

如果您对C语言或java代码或示例代码有任何建议,请介绍。

【问题讨论】:

  • 至少你需要告诉我们你的Add函数是如何在C++中定义的。
  • 你确定函数是从dll导出的吗?你确定 dll 在 PATH 上吗?
  • 您确定您的 Add 函数具有 JNI 定义的正确命名吗?
  • 我将 dll 放在我的 java 项目的 bin 路径中,我在 java 中使用相同的函数名,但我不确定我使用的是相同的类名。
  • 我使用了 Add 但现在我更改了 add,我有这个问题,它不能解决我的问题。

标签: java c++ dll


【解决方案1】:
  1. objdump 和 readelf 等工具会很有帮助。 (GCC)
  2. 函数名称格式为“_(JNIEnv *, jclass or jobject, [其余参数在此处])。(jclass 用于静态方法,jclass 用于非静态方法)
  3. 您不能直接与 Java 中的纯 c/c++ 库进行通信,您必须编写一个接口/胶水库来隧道调用。

提示: int APIENTRY(dllexport) add(int a, int b);
本机Java方法? ,见第 2 点

建议:我认为您对本机方法感到困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多