无法使带有打字稿的扩展 Java 接口在 Nativescript 中工作



我正在使用 Nativescript+Typescrit,我在原生插件中有一个 java 类和接口,我想直接在 typescript 中使用它们,为了清楚地描述问题,我做了一个简单的代码如下:

Java 接口是这样的:

package com.test;
public interface Animal {
public void eat();
}

Java 类使用此接口,如下所示:

package com.test;
public class Box {
private Animal animal;
public void setAnimal(Animal a){
this.animal = a;
}
public void startEat(){
this.animal.eat();
}
}

在打字稿中,我定义了一个类实现 Animal,如下所示:

@Interfaces(com.test.Animal)
export class Cat extends java.lang.Object {
constructor() {
super();
return global.__native(this);
}
public eat():void {
console.log("cat is eating");
}
}

现在我想像这样使用它:

import { Cat } from "./cat"
let box = new com.test.Box();
box.setAnimal(new Cat());
box.startEat();

在安卓模拟器中运行后,我收到此错误:

05-11 11:01:28.858 24611-24611/org.nativescript.ZeroNSClient E/art: JNI ERROR (app bug): attempt to pass an instance of com.tns.gen.java.lang.Object_cat_6_28_Cat as argument 1 to void com.test.Box.setAnimal(com.test.Animal)
05-11 11:01:28.864 24611-24611/org.nativescript.ZeroNSClient A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: bad arguments passed to void com.test.Box.setAnimal(com.test.Animal) (see above for details)
art/runtime/java_vm_ext.cc:470]     from java.lang.Object com.tns.Runtime.callJSMethodNative(int, int, java.lang.String, int, boolean, java.lang.Object[])
art/runtime/java_vm_ext.cc:470] "main" prio=5 tid=1 Runnable
art/runtime/java_vm_ext.cc:470]   | group="main" sCount=0 dsCount=0 obj=0x7464e610 self=0xb0c8b400
art/runtime/java_vm_ext.cc:470]   | sysTid=24611 nice=-10 cgrp=default sched=0/0 handle=0xb5003534
art/runtime/java_vm_ext.cc:470]   | state=R schedstat=( 0 0 0 ) utm=226 stm=315 core=2 HZ=100
art/runtime/java_vm_ext.cc:470]   | stack=0xbf30a000-0xbf30c000 stackSize=8MB
art/runtime/java_vm_ext.cc:470]   | held mutexes= "mutator lock"(shared held)
art/runtime/java_vm_ext.cc:470]   native: #00 pc 00572f6e  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+238)
05-11 11:01:28.865 24611-24611/org.nativescript.ZeroNSClient A/art: art/runtime/java_vm_ext.cc:470]   native: #01 pc 0053f35e  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+526)
art/runtime/java_vm_ext.cc:470]   native: #02 pc 0053c35b  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+75)
art/runtime/java_vm_ext.cc:470]   native: #03 pc 00392418  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+1560)
art/runtime/java_vm_ext.cc:470]   native: #04 pc 00392dcc  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortFEPKcS2_z+124)
art/runtime/java_vm_ext.cc:470]   native: #05 pc 00511367  /system/lib/libart.so (_ZN3artL18InvokeWithArgArrayERKNS_33ScopedObjectAccessAlreadyRunnableEPNS_9ArtMethodEPNS_8ArgArrayEPNS_6JValueEPKc+3575)
art/runtime/java_vm_ext.cc:470]   native: #06 pc 00511acc  /system/lib/libart.so (_ZN3art35InvokeVirtualOrInterfaceWithJValuesERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectP10_jmethodIDP6jvalue+380)
art/runtime/java_vm_ext.cc:470]   native: #07 pc 003e3b10  /system/lib/libart.so (_ZN3art3JNI15CallVoidMethodAEP7_JNIEnvP8_jobjectP10_jmethodIDP6jvalue+1056)
art/runtime/java_vm_ext.cc:470]   native: #08 pc 00142ab5  /system/lib/libart.so (_ZN3art8CheckJNI11CallMethodAEPKcP7_JNIEnvP8_jobjectP7_jclassP10_jmethodIDP6jvalueNS_9Primitive4TypeENS_10InvokeTypeE+2197)
art/runtime/java_vm_ext.cc:470]   native: #09 pc 001302ac  /system/lib/libart.so (_ZN3art8CheckJNI15CallVoidMethodAEP7_JNIEnvP8_jobjectP10_jmethodIDP6jvalue+108)
art/runtime/java_vm_ext.cc:470]   native: #10 pc 00088849  /data/app/org.nativescript.ZeroNSClient-1/lib/x86/libNativeScript.so (???)
art/runtime/java_vm_ext.cc:470]   native: #11 pc 0005f5d1  /data/app/org.nativescript.ZeroNSClient-1/lib/x86/libNativeScript.so (???)
art/runtime/java_vm_ext.cc:470]   native: #12 pc 000958f1  /data/app/org.nativescript.ZeroNSClient-1/lib/x86/libNativeScript.so (???)
art/runtime/java_vm_ext.cc:470]   native: #13 pc 0073db31  /data/app/org.nativescript.ZeroNSClient-1/lib/x86/libNativeScript.so (???)
art/runtime/java_vm_ext.cc:470]   native: #14 pc 007a4842  /data/app/org.nativescript.ZeroNSClient-1/lib/x86/libNativeScript.so (???)
art/runtime/java_vm_ext.cc:470]   native: #15 pc 007a4d4c  /data/app/org.nativescript.ZeroNSClient-1/lib/x86/libNativeScript.so (???)
art/runtime/java_vm_ext.cc:470]   native: #16 pc 007a5097  /data/app/org.nativescript.ZeroNSClient-1/lib/x86/libNativeScript.so (???)
art/runtime/java_vm_ext.cc:470]   native: #17 pc 0000007d   (???)
art/runtime/java_vm_ext.cc:470]   at com.tns.Runtime.callJSMethodNative(Native method)
art/runtime/java_vm_ext.cc:470]   at com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1088)
art/runtime/java_vm_ext.cc:470]   at com.tns.Runtime.callJSMethodImpl(Runtime.java:970)
art/runtime/java_vm_ext.cc:470]   at com.tns.Runtime.callJSMethod(Runtime.java:957)
art/runtime/java_vm_ext.cc:470]   at com.tns.Runtime.callJSMethod(Runtime.java:941)
art/runtime/java_vm_ext.cc:470]   at com.tns.Runtime.callJSMethod(Runtime.java:933)

我花了很多时间检查这个问题,但没有想法,最有可能的是我错误地扩展了 Animal 接口,我是根据这个扩展类接口做的。

如果我在打字稿中使用接口,它可以工作:

import { Cat } from "./cat"
let box = new com.test.Box();
box.setAnimal(new com.test.Animal({
eat() {
console.log("I am eatting");
}
}));
box.startEat();

所以我徘徊为什么我不能在打字稿中扩展 java 接口,感谢任何有用的答案。

似乎重新启动模拟器并重新运行"tns 运行 android"无需任何更改即可解决此问题。

最新更新