从 cpp lib 调用函数时的数据类型转换



CPP 菜鸟在这里。我正在尝试从我的 java 应用程序调用库函数。需要帮助匹配我的 Java 类中 C 函数的数据类型

C 函数签名

#define I_REAL double
int myfunction(int size,
I_REAL const *const *inputs,
I_REAL const *options,
I_REAL *const *outputs);

我的 java 本机方法签名(这可能是不正确的,我不确定const *const *inputs如何在 java 中翻译(

public static native int myfunction(int size,
final double[][] inputs,
final double[] options,
final double[][] outputs);

然后我使用javac Myclass.java -h .生成头文件

然后我实现了我的 cpp 代码 -

JNIEXPORT jint JNICALL Java_com_raj_myfunction
(JNIEnv *, jclass, jint, jobjectArray, jdoubleArray, jobjectArray)
{
// something useful here
}

我收到运行时错误 -java.lang.NoSuchMethodError: com.raj.Myclass.myfunction(I[D[D[D)I

我认为我的 java 本机方法签名遇到了一些问题。我必须匹配 C 函数签名,任何帮助将不胜感激。

在这里更改 2 件事:

  • 双倍[][] 到双倍[]
  • 添加具有reinterpret_cast的强制转换

所以在你的 JNI 函数调用中,你必须做 -reinterpret_cast<I_REAL const *const*>(&inputs)调用 C 函数的位置。

希望这有帮助。

您可以像从double数组中读取一样直接从jdouble* incoming读取。

最新更新