(JNI)从cpp lib

时间:2018-08-12 18:06:46

标签: c++ java-native-interface

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 个答案:

答案 0 :(得分:1)

在这里更改2件事:

  • double [] []为double []
  • 使用reinterpret_cast添加投射

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

希望这会有所帮助。

答案 1 :(得分:0)

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