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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(JNI)从cpp lib调用函数时的数据类型转换相关的知识,希望对你有一定的参考价值。

CPP noob在这里。我试图从我的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函数签名,任何帮助表示赞赏。

答案

在这里改变两件事:

  • double [] []加倍[]
  • reinterpret_cast添加铸件

所以在你的jni函数调用中你必须做 - reinterpret_cast<I_REAL const *const*>(&inputs)你在哪里调用你的C函数。

希望这可以帮助。

另一答案

您可以直接从jdouble* incoming读取,例如从double数组中读取。

以上是关于(JNI)从cpp lib调用函数时的数据类型转换的主要内容,如果未能解决你的问题,请参考以下文章

无法从JNI GetMethodId函数中获取值[关闭]

请教,jni调用,类型转换.用opencv进行静态人脸检测

Android深入理解JNI类型转换方法签名和JNIEnv

如何在 JNI 中使用自定义类类型参数调用 Java 函数

Android 安装包优化使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(代码片

JNI/NDK开发指南——JNI数据类型及与Java数据类型的映射关系