我有一个Java函数,它将接收可变数量的参数,在JNI中,我收到jobjectArray
中的所有参数。现在我的问题是:如何以原始形式取回参数(它们可以是字符串,双数组,int ......)?
修改(根据评论)
以下是详细信息。这是我的功能声明:
private native double gsl_stats_all_in_one(String...str);
这是我的函数调用:
variance = this.gsl_stats_all_in_one((String)message.getBody().get("function2"),
Arrays.toString(data), "1","5");
这是函数定义:
JNIEXPORT jdouble JNICALL Java_org_bel_MyJMSListenerAction_gsl_1stats_1all_1in_1one (JNIEnv *env, jobject obj, jobjectArray arr)
现在我的arr拥有所有4个参数,其中第一个是字符串,第二个是double,第三个和第四个是整数。如何以原始形式取回所有四个参数。
答案 0 :(得分:1)
jobjectArray不包含整数或双精度或任何基本类型。它包含对象。 jintArray包含整数等。您需要重新考虑您的问题。如果您尝试声明本机varargs方法,则最终参数确实是jobjectArray并且它包含对象。如果您的Java代码传递了int,double等,它们将转换为Integer,Double等,因此您在本机方法中收到的内容始终是一个对象。您可以通过常规的JNI调用在运行时查询每个项目的类。
答案 1 :(得分:0)
如果你声明一个方法来获取一个Object [],它就是你所拥有的,它只接受对象。为了帮到你,Java将'autobox'原始类型转换为相应的对象类型。如果你写whatever(1)
,你将获得Integer.valueOf(1)
的效果。
Java中没有办法声明采用原始类型的varadic函数。所有的varadic函数都采用某种或那种对象。所以,无论你做什么,你都无法得到那个“原始的”原始1
。