提问者:小点点

Java本地包装要求


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

C/C++:

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

工作的包装:

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

引发Java未满足链接错误的包装:

package com.ourcompany.wrapper

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

我们不能更新C/C++代码。 我们只得到一些头和预先构建的库。 我是不是漏掉了什么? 因为如果存在包,它似乎不愿意链接代码。


共1个答案

匿名用户

我不知道为什么你的第一个例子能起作用。 我无法重现它,因为每个本机方法都有一个特殊的名称,它包括包名,类名,。。。我建议编写一个本机包装器。

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

作为Java密码。 之后,使用javah(在较新的版本中已弃用并删除)或javac-h生成一个头。 您将得到以下原型:

jniexport jint JNICALL Java_Wrapper_addTwoNumbers(JNIEnv*,jobject/*或jclass(如果是static*/,jint,jint);

现在您必须实现函数:

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

另一个办法是南国防军:

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

并按如下方式使用:api.instance.addtwonumbers(3,4);