Java 本机包要求

Java native package requirements

我继承了一些 C/C++ 代码,我们需要将其包装在 Java 中,这是一个试图说明问题的人为示例。

C/C++:

void addTwoNumbers(int x, int y) {
  return x + y;
}

有效的包装器:

class Wrapper {
  public native int addTwoNumbers(int x, int y);
}

包装器抛出 Java 不满意 link 错误:

package com.ourcompany.wrapper

class Wrapper {
  public native int addTwoNumbers(int x, int y);
}

我们无法更新 C/C++ 代码。我们只得到一些头文件和预构建的库。我错过了什么吗?因为它似乎不愿意link代码如果有包。

我不确定为什么您的第一个示例有效。我无法重现它,因为每个本机方法都有一个特殊的名称,由包名、类名等组成……我建议编写一个本机包装器。

class Wrapper {
  public native /*static */ int addTwoNumbers(int x, int y);
}

为 Java 代码。之后生成 header,其中包含 javah(在较新版本中已弃用和删除)或 javac -h。 您将获得以下原型:

JNIEXPORT jint JNICALL Java_Wrapper_addTwoNumbers(JNIEnv *,jobject /*or jclass if static */,jint,jint);

现在你要实现的功能是:

JNIEXPORT jint JNICALL Java_Wrapper_addTwoNumbers(JNIEnv *env,jobject obj,jint a,jint b){
  return addTwoNumbers(a,b);
}

另一种方法是 JNA:

public interface API extends Library {
    API INSTANCE = (API) Native.loadLibrary("library", API.class);
    int addTwoNumbers(int a,int b);
}

并像这样使用它: API.INSTANCE.addTwoNumbers(3,4);