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);
我继承了一些 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);