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

时间:2017-02-03 03:34:54

标签: android ios nativescript

所以我的经理似乎认为将应用程序从2个完全原生的iOS和Android应用程序转换为一个跨平台的角度/原始应用程序是一项简单的任务(对我来说这听起来是个糟糕的主意)。我试图研究这样做所需的努力。我创建了一个helloworld nativescript应用程序,我试图看看将现有本机代码集成到nativescript应用程序的最佳方式是什么(基本上我想访问我的本机webservice功能)。我对这个问题的了解非常有限。

我已经看到有一种方法可以使用make your own native packages,但这似乎是很多努力和繁琐/凌乱的方式。有没有办法只访问nativescript中的自定义本机java对象?例如:

//Java
package com.tns;

public class TestObject {
    public String doSomething () {
        return "hello";
    }
}
//Nativescript
import { Component } from "@angular/core";

declare var com: any

@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();
        console.log(test.doSomething());
    }
}

编辑:对于未来的读者,上面的代码实际上正在工作

我认识你can do it只是普通的Android类,但是我没有能够使用我自己的自定义类,也许我只是缺少一些东西(可能与导入有关吗?)。

尝试运行程序时出现此错误

app/app.component.ts(21,24): error TS2304: Cannot find name 'com'.

我的对象就在项目的主文件夹下

screenshot

基本上他们希望我们一次将android应用程序的某些部分转换为nativescript,同时保留所有旧的本机功能,以便最终将整个项目转换为nativescript,从而为两个ios提供一个代码库和理论上的android。听起来像是一个非常糟糕的方式,应该从头开始imo。

TL; DR

如何在nativescript代码中使用自定义java类?

-----评论的补充------

  

&#34; main&#34;发生了未被捕获的异常。线。   com.tns.NativeScriptException:调用js方法onTouch失败

     

[object Object]文件:   &#34;文件:///data/data/org.nativescript.HelloWorld/files/app/tns_modules/tns-core-modules/ui/gestures/gestures.js,   line:97,column:40

     

堆栈跟踪:       框架:功能:&#39; GesturesObserver.androidOnTouchEvent&#39;,文件:&#39; file:///data/data/org.nativescript.HelloWorld/files/app/tns_modules/tns-core-modules/ui/姿势/ gestures.js&#39 ;,   line:97,column:41       框架:功能:&#39; onTouch&#39;,文件:&#39; file:///data/data/org.nativescript.HelloWorld/files/app/tns_modules/tns-core-modules/ui/core/ view.js&#39 ;,   line:113,column: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)
...

2 个答案:

答案 0 :(得分:2)

尝试排除那些圆括号:)同样的事情来分配我在插件中使用的类。

修改

应该是这些括号:D

var test = new com.tns.TestObject();
console.log(test.doSomething());

答案 1 :(得分:0)

正如@Brad Martin在评论中解释的那样,你所需要的就是声明com是什么,你将能够在你的nativescript代码中使用java文件而不会有任何麻烦

//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
    }
}

我的java文件位于android项目中:

File location in Android project for reference