Android 如何在nativescript中使用自定义本机java类/函数?
因此,我的经理似乎认为,将一个应用程序从两个完全原生的iOS和Android应用程序转换为一个跨平台angular/NativeScript应用程序是一项简单的任务(对我来说,这听起来是个糟糕的主意)。我正在努力研究做这件事需要付出的努力。我创建了一个helloworld nativescript应用程序,我试图了解将现有本机代码集成到nativescript应用程序中的最佳方式是什么(基本上我希望能够访问我的本机webservice功能)。我对这个问题的了解非常有限 我看到有一种方法可以使用,但这似乎是一种费劲和麻烦的方法。没有办法只访问nativescript中的自定义本机java对象吗?例如:Android 如何在nativescript中使用自定义本机java类/函数?,android,ios,nativescript,Android,Ios,Nativescript,因此,我的经理似乎认为,将一个应用程序从两个完全原生的iOS和Android应用程序转换为一个跨平台angular/NativeScript应用程序是一项简单的任务(对我来说,这听起来是个糟糕的主意)。我正在努力研究做这件事需要付出的努力。我创建了一个helloworld nativescript应用程序,我试图了解将现有本机代码集成到nativescript应用程序中的最佳方式是什么(基本上我希望能够访问我的本机webservice功能)。我对这个问题的了解非常有限 我看到有一种方法可以使用,
//Java
package com.tns;
public class TestObject {
public String doSomething () {
return "hello";
}
}
//Java
package com.tns;
public class TestObject {
public String doSomething () {
return "hello";
}
}
我的对象就在我项目的主文件夹下 基本上,他们希望我们一次将android应用程序的某些部分转换为nativescript,同时保留所有旧的本机功能,以便最终整个项目将转换为nativescript,从而在理论上为ios和android提供一个代码库。听起来这是一个非常糟糕的方法,应该从头开始 TL;DR 如何在nativescript代码中使用自定义java类 -----评论中的补充------ “主”线程上发生未捕获的异常。 com.tns.nativeScript异常:在Touch上调用js方法失败 [对象]文件: "file:///data/data/org.nativescript.HelloWorld/files/app/tns_modules/tns-core-modules/ui/gestures/gestures.js, 行:97,列:40 堆栈跟踪: 框架:函数:'GesturesObserver.androidOnTouchEvent',文件:'file:///data/data/org.nativescript.HelloWorld/files/app/tns_modules/tns-core-modules/ui/gestures/gestures.js', 行:97,列:41 框架:函数:'onTouch',文件:'file:///data/data/org.nativescript.HelloWorld/files/app/tns_modules/tns-core-modules/ui/core/view.js', 行:113,列:37
at com.tns.Runtime.callJSMethodNative(Native Method)
at com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1197)
at com.tns.Runtime.callJSMethodImpl(Runtime.java:1061)
at com.tns.Runtime.callJSMethod(Runtime.java:1047)
at com.tns.Runtime.callJSMethod(Runtime.java:1028)
...
尝试排除这些圆括号:)同样的事情分配类,我在插件使用
编辑
应该用括号括起来:D
var test = new com.tns.TestObject();
console.log(test.doSomething());
正如@Brad Martin在评论中所解释的,您只需声明
com
是什么,就可以在nativescript代码中使用java文件,而无需任何麻烦
//Nativescript
从“@angular/core”导入{Component}”;
声明var com:any//这是重要的部分
@组成部分({
选择器:“我的应用程序”,
模板:`
如果您将自定义文件引入项目中,您在这里拥有的var test=new com.tns.TestObject()
确实应该可以工作。是否记录(测试)
实际输出任何东西?至于你的angular部分,这些东西会在web版本上使用吗?如果不会,我会跳过angular部分,使用普通的NativeScript。这两种方法肯定都有优点/缺点,但如果它永远不会出现在web上,那么在你的NativeScript应用程序中使用angular就不会有任何好处。没有什么可以改变的不管怎么说,我还是要说:)@BradMartin Ive用更多信息更新了我的问题,我也在编辑我的.ts文件,它也是主要的原生脚本项目文件夹,不在platforms/android/etc下供参考。不会在代码中使用任何web组件,因此感谢您的建议,这是一个ts错误,与nativescript没有任何关系。因此,您有两个问题处理TS编译器中的选项。在项目的tsconfig.json中设置noemitError:false
。这将允许编译器在有错误的情况下发出。或者,您可以在导出上方放置declare var com:any
,以便TS知道com只是类型any
。处理中有更多选项,但这应该会有所帮助。TS错误a将前缀改为TS
so,TS2304
表示TS警告/错误。这没有什么大的障碍:)NativeScript团队也有android和iOS typescript键入,以帮助intellisense并通知TS本机类、方法、道具等。因此编译器不会发出太多声音。您可以使用npm安装添加这些tns平台声明
我想。他们有另一个工具,试图为添加到您的项目中的自定义java/android库/模块生成TS类型。但我没有使用它。好吧,我按照您的建议执行了noemitError:false
和declare var com:any
,这让它可以编译,但我现在遇到了崩溃,异常错误不是很有用,只是说在文件birters.js中的onTouch崩溃,我假设它与onTap()有关我离开电脑一段时间,所以我只能在一段时间内回复,但是如果你有任何其他建议,请把它们留在这里,非常感谢你提供的信息。嗯,很奇怪,我成功了,但这不是因为圆括号,我不知道这是怎么回事,因为它不起作用嗯,就像我改变了任何重要的东西,但你是对的,它实际上不需要圆括号,但它仍然可以使用它们…是的,在检查了整个代码之后,我想ehm什么?
关于那些不需要前缀的,var ArrayList=java.util.ArrayList;
然后只需要调用isvar list=newArrayList()
啊,太棒了,有没有一种方法可以在项目中全局定义类似的东西,或者必须在每个文件的基础上进行定义?也许你可以只导出一个文件,然后导出每个前缀变量,并在需要时导入它们?我们至少可以在文件范围内声明它吗?我尝试过使用声明var TestObject:com.tns.TestObject
但这不起作用,无法再次找到“com”,尽管com是用declare var com:any在上面声明的,但在我更新java文件后,不知何故我得到了“it's not a function”错误。因此,我自动复制了文件调用
var test = new com.tns.TestObject();
console.log(test.doSomething());
//Java
package com.tns;
public class TestObject {
public String doSomething () {
return "hello";
}
}
//Nativescript
import { Component } from "@angular/core";
declare var com: any //this is the important part
@Component({
selector: "my-app",
template: `
<ActionBar title="My App"></ActionBar>
<StackLayout orientation="vertical">
<Label [text]="message" (tap)="onTap()"></Label>
</StackLayout>
`
})
export class AppComponent {
public message: string = "Hello, Angular";
public onTap() {
this.message = "Text Changed";
var test = new com.tns.TestObject(); //cant use this without the declare above
console.log(test.doSomething()); //will print "hello" in the console
}
}