java调用jobjectarray中带参数的NewObject方法jni
我在C++中使用JNI,并且创建了一系列方法,其中一系列参数作为JObjeTracle传递给我的本地方法。我想使用这些参数调用JNI中的构造函数。但是,NewObject方法不接受jobject数组,而是使用省略号。我将如何完成这项任务?我不知道在调用方法和从java传递签名字符串之前,构造函数将接受多少参数。我所调用的构造函数不把数组作为参数,而是将同一类的不同版本传递给C++函数,每个函数包含不同的方法签名。我需要我的C++方法来泛泛地创建任何带有它的参数的对象。我正在使用VisualStudio作为我的IDE。我知道我可能需要一个jvalues数组,但我不知道如何从jobjectarray获得它
# 1 楼答案
这有点棘手,因为您通过了一个
jobjectArray
。这意味着基元类型已经装箱(例如,数组中的int
是java.lang.Integer
实例),您必须在将它们传递到构造函数之前取消装箱您需要做的是解析方法签名字符串(它没有您想象的那么糟糕),遍历数组中的每个
jobject
,并将其转换为相应的类型(如果需要,使用取消装箱转换)遗憾的是,JNI中没有内置的方法来执行取消装箱,因此您必须通过调用装箱值的适当方法(例如
Integer.intValue
来获取int
来手动执行基本思想是:
object_to_byte
和其他转换函数将被定义为取消绑定相关类型的函数(例如object_to_byte
将使用JNI调用给定对象上的java.lang.Byte.byteValue
)# 2 楼答案
多亏了@LukeHutchinson的提示,我开始寻找更好的解决方案,并且很高兴地报告,实际上有一种更简单的方法使用反射API。您可以使用JNI函数
ToReflectedMethod
将methodID
转换为java.lang.reflect.Method
或java.lang.reflect.Constructor
,然后可以分别调用invoke
或newInstance
,这将处理所有必要的取消装箱转换这里是一个概念证明,为了清晰起见,省略了错误检查
test.java
:libnative.c
:# 3 楼答案
编辑:
对不起,我误解了你的问题。您可以通过使用JNI API为创建对象(从docs)提供的其他两种方法来实现这一点:
NewObjectA
NewObjectV
所以,我制作了一个示例程序来演示如何使用它
Foo。java
条。java
条。h
条。c
Main。java
警告:它仍然不是100%functiontal,因为我无法确定如何根据构造函数签名检索构造函数参数大小