Android 如何在nativescript中使用自定义本机java类/函数?

Android 如何在nativescript中使用自定义本机java类/函数?,android,ios,nativescript,Android,Ios,Nativescript,因此,我的经理似乎认为,将一个应用程序从两个完全原生的iOS和Android应用程序转换为一个跨平台angular/NativeScript应用程序是一项简单的任务(对我来说,这听起来是个糟糕的主意)。我正在努力研究做这件事需要付出的努力。我创建了一个helloworld nativescript应用程序,我试图了解将现有本机代码集成到nativescript应用程序中的最佳方式是什么(基本上我希望能够访问我的本机webservice功能)。我对这个问题的了解非常有限 我看到有一种方法可以使用,

因此,我的经理似乎认为,将一个应用程序从两个完全原生的iOS和Android应用程序转换为一个跨平台angular/NativeScript应用程序是一项简单的任务(对我来说,这听起来是个糟糕的主意)。我正在努力研究做这件事需要付出的努力。我创建了一个helloworld nativescript应用程序,我试图了解将现有本机代码集成到nativescript应用程序中的最佳方式是什么(基本上我希望能够访问我的本机webservice功能)。我对这个问题的了解非常有限

我看到有一种方法可以使用,但这似乎是一种费劲和麻烦的方法。没有办法只访问nativescript中的自定义本机java对象吗?例如:

//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;
然后只需要调用is
var 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
    }
}