如何使用 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 中的本机库中获取 double
和 unsigned 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 中的回调函数传递多个参数