将JObject转换为JList



JObject强制转换为JList(或者其他任何事情,都无关紧要,这只是一个示例(,执行JList(MyJobject)是一种好方法吗?我没有收到任何错误,但我不确定这是否是正确的做法。

在不同对象类型之间进行强制转换时,不能使用纯类型强制转换。必须将JObject强制转换为ILocalObject并调用其GetObjectID()方法,然后将结果传递给目标类类型的Wrap()方法,在本例中为TJList,例如:

例如:

var
MyJobject: JObject;
MyJList: JList;
MyJobject := ...;
MyJList := TJList.Wrap((MyJobject as ILocalObject).GetObjectID);

或者更简单(这只是上面的包装(:

var
MyJobject: JObject;
MyJList: JList;
MyJobject := ...;
MyJList := TJList.Wrap(MyJobject);

请参见执行的目的(MyJobject作为ILocalObject(。GetObjectID

使用普通类型转换可能存在两个问题。

首先,如果特定的Java类没有用以前的Delphi代码初始化,那么它的VMT表将不会初始化。接下来,JNI调用返回的引用是本地引用,并且它们仅在特定本机方法的持续时间内有效。

JNI提示

传递给本机方法的每个参数,以及几乎每个对象由JNI函数返回的是";本地参考";。这意味着它在当前线程。即使对象本身在如果本机方法返回,则引用无效。

这适用于jobject的所有子类,包括jclass、jstring、,和jarray。(运行时将警告您大多数引用错误使用当启用扩展JNI检查时。(

获取非本地引用的唯一方法是通过函数NewGlobalRef和NewWeakGlobalRef。

如果你想在更长的时间内保留一个推荐人,你必须使用";全局";参考NewGlobalRef函数采用本地引用作为参数,并返回一个全局参数。全球在调用DeleteGlobalRef之前,引用保证是有效的。

Wrap解决了这两个问题。它初始化Java类VMT(如果尚未初始化(,并将本地JObject引用转换为全局引用。

只有当类由以前的一些代码初始化,并且本地引用没有在检索所述引用的本机(Delphi(方法之外使用时,纯类型转换才能工作。

这就是JStringToString(JString(PurchaseDataList.get(I)))中使用的普通类型转换可以正常工作的原因。get返回的JObject引用立即转换为Delphi字符串,此时JStringVMT已经初始化,是常用的Java类。

当有疑问时,使用Wrap更安全,但它也比普通的typecast花费更多的时间。

最新更新