如何使用 JNI 从本机 c 库将 double 和 unsigned int 返回到 java

Posted

技术标签:

【中文标题】如何使用 JNI 从本机 c 库将 double 和 unsigned int 返回到 java【英文标题】:How to return double and unsigned int from native c library to java using JNI 【发布时间】:2017-06-27 20:28:50 【问题描述】:

我是使用 JNI 的新手,因此我试图从 C 中的本机库中获取 doubleunsigned int 并将值返回到我的 java 端,但我不断从 android Studio 收到以下错误

Error:(111, 37) error: called object type 'double' is not a function or function pointer
Error:(117, 43) error: called object type 'unsigned int' is not a function or function pointer
Error:(220, 19) error: functions that differ only in their return type cannot be overloaded

这是我的代码:

double SuperpoweredExample::getPosition() 

    double pos = playerA->positionMs();

    return pos;


unsigned int SuperpoweredExample::getDuration() 
    unsigned int dur = playerA->durationMs();
    return dur;

虽然这是外部 C 结构

JNIEXPORT jdouble Java_com_superpowered_crossexample_MainActivity_getPosition(JNIEnv *javaEnvironment, jobject self) 

    return example->getPosition();

JNIEXPORT jint Java_com_superpowered_crossexample_MainActivity_getDuration(JNIEnv *javaEnvironment, jobject self) 
    return example->getDuration();

请大家帮忙,我将不胜感激... 提前谢谢你

【问题讨论】:

Java 没有整数类型的有符号和无符号变体。除char 之外的所有Java 整数类型均已签名。因此,您不能将unsigned int 本身返回给Java;您必须将其转换为 Java 支持的类型。原则上,您可能还需要转换 C double,但实际上,double 和 JNI jdouble 几乎可以肯定是同一类型。 话虽如此,错误消息与所显示代码之间的关系尚不清楚。为尽可能获得有用的帮助,请提交 minimal reproducible example 来说明问题。 这些错误消息引用了哪些代码行?您似乎正在尝试将数据成员视为函数。他们不是。你不能打电话给他们。注意这里没有“外部 C 结构”。 @IsaacOyewole - 链接的文档显示您正尝试像方法调用一样访问数据成员,如下面的 EJP 回答。您正在使用playerA->positionMs()。删除表示函数调用的括号——只需使用playerA->positionMs 您可以点击下方EJP答案上的勾号,接受他的答案。 【参考方案1】:

您并没有完全麻烦自己提供完整的类定义,或者回答您在 cmets 中被问到的问题,但似乎

playerA->positionMs

是数据成员,而不是成员方法,对于其他方法调用也是如此。因此,您不能将它们称为方法。但是您可以直接将它们作为值返回。

【讨论】:

我很抱歉@EJP,但我正在使用本机 SDK 库,我从中创建了一个应该返回“双”值的类的实例......我一直在搜索文档,因此我可以正确响应此处提供的帮助,因为我对本机 c 编程非常陌生。据说我在 DOUBLE 方法“getPosition”中查询的变量类返回一个双精度值,但我不断收到构建错误,即双精度不是函数或函数指针,并且行 playerA->positionMs;被标记出来了。 因此,正如我所说,它是一个变量,而不是您的代码所说的函数。您需要发布这些变量/函数/无论它们是什么的定义来澄清这一点。

以上是关于如何使用 JNI 从本机 c 库将 double 和 unsigned int 返回到 java的主要内容,如果未能解决你的问题,请参考以下文章

从本机 c 代码 (JNI) 为 Java 中的回调函数传递多个参数

如何从java本机接口调用getStackTrace方法(jni)

JNI维数组:将二维数组从java传递给c

Android NDK将参数传递给本机方法

使用 JNI 在 Java 调用之间将本机对象保存在内存中

Java JNI:如何从 C++ 的本机方法设置 Java 类的 String [] 字段