帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:NAT  开发环境  环境  Javascript  micr  envi  JAVA  BASE  
The LiquidCore library provides independent, instantiable Node.js virtual machines for mobile apps each with its own lifecycle, virtual file system, and SQLite database.

  • 源代码名称:LiquidCore
  • 源代码网址:http://www.github.com/LiquidPlayer/LiquidCore
  • LiquidCore源代码文档
  • LiquidCore源代码下载
  • Git URL:
    git://www.github.com/LiquidPlayer/LiquidCore.git
  • Git Clone代码到本地:
    git clone http://www.github.com/LiquidPlayer/LiquidCore
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/LiquidPlayer/LiquidCore
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • LiquidCore项目

    LiquidCore为开发者提供了一种在Javascript中创建原生移动微型应用程序的环境,它可以被嵌入到其他应用程序中。 思考:移动应用的本地 <iframe>。 一个简单的应用程序仅仅可以在云端服务,因此在所有移动设备上都可以即时更新服务器端。

    LiquidCore还为Android开发者执行它的应用程序的原始 JavaScript inside 提供了一种方便的方法,因为iOS开发人员已经可以在。

    LiquidCore目前仅在Android上可用,但将被移植到 iOS。

    版本

    0.4.6 通过 JitPack获得它

    Release

    Javadocs

    版本 0.4.6

    目录

    本节介绍LiquidCore的两个主要的预期用例,包括 Hello World ! step-by-step示例。

    你还可以将LiquidCore用作原始原生Javascript引擎( 例如。 作为 AndroidJSCore的替代项。 这个话题是讨论这里的

    微型服务

    微型应用是建立在微型服务系统。 微服务仅仅是一个独立的node.js 实例,它的启动代码由URI引用。 例如:

    MicroService service =newMicroService(androidContext,
     newURI("http://my.server.com/path/to/code.js"));
    service.start();

    服务URI可以引用服务器URL或者本地Android资源( 比如。 android.resource://com.example.myapp/raw/some_js_filesome_js_file.jsres/raw/some_js_file.js --中注意,当使用Android资源时,在URI中省略了 .js。 虽然动态更新是一个重要的值,但是本地资源支持调试和/或者备份( 比如 ),因此LiquidCore主要用于远程 url。 如果网络不可用,则为工厂预置。

    一旦 node.js 环境建立,微型服务就可以与主机应用程序通信。 可以通过在 MicroService 构造函数中添加一个 ServiceStartListener 来确定:

    MicroService service =newMicroService(
     androidContext,
     newURI("http://my.server.com/path/to/code.js"),
     newMicroService.StartServiceListener() {
     @OverridepublicvoidonStart(MicroServiceservice, Synchronizersynchronizer) {
     //.. The environment is live, but the startup JS code (from the URI)// has not been executed yet. }
     }
    );
    service.start();

    微型服务通过简单的EventEmitter 接口和eponymously调用 LiquidCore 与主机通信。 例如在你的JavaScript启动代码( 本示例中的code.js ) 中:

    LiquidCore.emit('my_event', {foo:"hello, world", bar:5, l337 : ['a', 'b'] })

    在Java端,宿主应用程序可以侦听事件:

    //.. . in the StartServiceListener.onStart() method:service.on("my_event", newMicroService.EventListener() {
     @OverridepublicvoidonEvent(MicroServiceservice, Stringevent, JSONObjectpayload) {
     try {
     android.util.Log.i("Event:"+ event, payload.getString("foo"));
     // logs: I/Event:my_event: hello, world } catch (JSONException e) {
     e.printStackTrace();
     }
     }
    });

    类似地,微型服务可以侦听来自主机的事件:

    JSONObject payload =newJSONObject();
    payload.put("hallo", "die Weld");
    service.emit("host_event", payload);

    然后,在Javascript中:

    LiquidCore.on('host_event', function(msg) {
     console.log('Hallo, '+msg.hallo)
    })

    LiquidCore创建一个方便的虚拟文件系统,这样微型服务的实例不会无意或者恶意地互相干扰,或者其他的安卓 文件系统。 这里详细描述了文件系统( )。

    微型应用

    微服务有很多用途。 它们实际上是利用 node 社区所做的所有工作的有用之处。 但是我们希望能够创建自己的本机应用程序,这些应用程序不需要大量的交互。 为了实现这个目的,我们将引入一个更多的术语: 表面。曲面是用于微型服务的用户界面画布。

    目前有两个曲面:

    正在考虑其他曲面,包括:

    • WebSurface - 一个 WebView 前端,微型服务可以在其中写入 DOM
    • CardSurface - 一个适用于列表中用户界面元素的有限特性集
    • OpenGLSurface - 一个 OpenGL 画布

    最终,我们希望有虚拟/增强现实曲面,以及非图形画布,比如聊天和语音查询接口。

    "hallo,模具焊接"微型服务教程 !

    先决条件

    ( 你可以在这里的一个完整示例项目中找到所有代码 below 如果你被卡住的话)。

    要使用微型服务,你需要两件事: 微型服务代码和主机应用程序。

    我们首先创建一个非常简单的微服务,它只会向主机发送一个欢迎消息。 这将由我们网络上的一台机器提供。 首先在某个地方创建一个工作目录。

    
    $ mkdir ~/helloworld
    
    
    $ cd ~/helloworld
    
    
    
    

    然后,从 npm 安装LiquidCore服务器( 命名为 LiquidServer。):

    
    $ npm install -g liquidserver
    
    
    
    

    现在我们来创建一个微型服务。 在名为 service.js~/helloworld 目录中创建一个文件,并将它的填入以下内容:

    /* Hello, World! Micro Service */// A micro service will exit when it has nothing left to do. So to// avoid a premature exit, let's set an indefinite timer. When we// exit() later, the timer will get invalidated.setInterval(function() {}, 1000)// Listen for a request from the host for the 'ping' eventLiquidCore.on( 'ping', function() {
     // When we get the ping from the host, respond with"Hallo, die Weld!"// and then exit.LiquidCore.emit( 'pong', { message:'Hallo, die Weld!' } )
     process.exit(0)
    })// Ok, we are all set up. Let the host know we are ready to talkLiquidCore.emit( 'ready' )

    接下来,我们来设置一个 Manifest 文件。 现在不要太担心这个问题。 从基本上说,Manifest 允许我们基于主机提供的功能/权限来服务不同的版本。 但是对于我们的简单示例,我们将向任何请求者提供相同的文件。 在同一目录中创建一个名为 service.manifest的文件:

    {
     "configs": [
     {
     "file":"service.js" }
     ]
    }

    这告诉LiquidServer当请求传入 service.js 时,它应该服务于我们的service.js 文件。 这看起来有些傻,但是还可以设置其他有用的属性。 但是,出于我们的目的,它们还不需要。

    你现在可以运行你的服务器。 选择某个端口( 比如说,8080 ),否则LiquidServer将为你创建一个:

    
    $ liquidserver 8080
    
    
    
    

    你现在应该看到了 Listening on port 8080 恭喜你刚刚创建了一个微型服务。 你可以通过导航到浏览器中的http://localhost:8080/service.js 来测试它是否工作正常。 你应该看到你刚刚创建的service.js的内容,它使用了一些包装器代码。 包装器只是允许将多个 node.js 模块打包到一个文件中。 如果要将它的他一些 MODULE 设置为 require(),那么该 MODULE 及它的依赖项将被包装到这个单个文件中。

    你可以离开或者稍后重新启动。 现在我们需要创建一个主机应用程序。

    • 在 Android Studio 中,通过选择以下方法创建一个新项目 File -> New Project.. .
    • 填写基本内容并按 Next ( 应用程序 NAME: HelloWorld,公司域:liquidplayer.org,软件包 NAME: org.liquidplayer.examples.helloworld )
    • 填写目标设备的信息。 默认值很好。单击 Next
    • 选择 Empty Activity,然后选择 Next
    • 默认选项是确定的。 单击 Finish

    你现在有了一个基本的应用。 继续,在 模拟器 中运行它。 如果你没有明白为什么我们要创建一个"hallo,模具焊接"应用程序,你可能会看到为什么现在。 你已经从 Android Studio 获得"你好,世界"。 我们要用我们的微型服务来讲德语。

    接下来,打开 res/layout/activity_main.xml 文件。 我们需要做一些修改。 将内容替换为以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="org.liquidplayer.examples.helloworld.MainActivity">
     <TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"/>
     <Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="Sprechen Sie Deutsch!"/>
    </RelativeLayout>

    我们所改变的就是我们给了 TextView 一个 NAME: text,并添加了一个按钮。 继续,重新运行。 你现在应该在中间看到一个大按钮。

    现在是连接LiquidCore的时候了。 首先,你必须添加库。 转到根级别 build.grade 文件并添加 jitpack 依赖项:

    
    ...
    
    
    
    allprojects {
    
    
     repositories {
    
    
     jcenter()
    
    
     maven { url 'https://jitpack.io' }
    
    
     }
    
    
    }
    
    
    
    ...
    
    
    
    

    然后,将LiquidCore库添加到你的app的 build.gradle:

    
    dependencies {
    
    
    . . .
    
    
     implementation 'com.github.LiquidPlayer:LiquidCore:0.4.6'
    
    
    }
    
    
    
    
    

    请注意,如果使用旧的buildtools版本,则应该用 compile 替换 implementation

    继续并同步以确保库下载和链接正确。 再次运行该应用程序以确保一切都正常。

    现在,让我们把按钮连接到微型服务。 在应用程序中编辑 MainActivity.java,并将以下内容替换为以下内容:

    packageorg.liquidplayer.examples.helloworld;importandroid.os.Handler;importandroid.os.Looper;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;importorg.json.JSONException;importorg.json.JSONObject;importorg.liquidplayer.service.MicroService;importorg.liquidplayer.service.MicroService.ServiceStartListener;importorg.liquidplayer.service.MicroService.EventListener;importjava.net.URI;importjava.net.URISyntaxException;publicclassMainActivityextendsAppCompatActivity {
     // IMPORTANT: Replace this with YOUR server's address or nameprivatefinalString serverAddr ="192.168.1.152:8080";
     @OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     finalTextView textView = (TextView) findViewById(R.id.text);
     finalButton button = (Button) findViewById(R.id.button);
     // Our 'ready' listener will wait for a ready event from the micro service. Once// the micro service is ready, we'll ping it by emitting a"ping" event to the// service.finalEventListener readyListener =newEventListener() {
     @OverridepublicvoidonEvent(MicroServiceservice, Stringevent, JSONObjectpayload) {
     service.emit("ping");
     }
     };
     // Our micro service will respond to us with a"pong" event. Embedded in that// event is our message. We'll update the textView with the message from the// micro service.finalEventListener pongListener =newEventListener() {
     @OverridepublicvoidonEvent(MicroServiceservice, Stringevent, finalJSONObjectpayload) {
     // NOTE: This event is typically called inside of the micro service's thread, not// the main UI thread. To update the UI, run this on the main thread.newHandler(Looper.getMainLooper()).post(newRunnable() {
     @Overridepublicvoidrun() {
     try {
     textView.setText(payload.getString("message"));
     } catch (JSONException e) {
     e.printStackTrace();
     }
     }
     });
     }
     };
     // Our start listener will set up our event listeners once the micro service Node.js// environment is set upfinalServiceStartListener startListener =newServiceStartListener() {
     @OverridepublicvoidonStart(MicroServiceservice, Synchronizersynchronizer) {
     service.addEventListener("ready", readyListener);
     service.addEventListener("pong", pongListener);
     }
     };
     // When our button is clicked, we will launch a new instance of our micro service. button.setOnClickListener(newView.OnClickListener() {
     @OverridepublicvoidonClick(Viewv) {
     try {
     URI uri =newURI("http://"+serverAddr+"/service.js");
     MicroService service =newMicroService(MainActivity.this, uri, startListener);
     service.start();
     } catch (URISyntaxException e) {
     e.printStackTrace();
     }
     }
     });
     }
    }

    确保将 serverAddr 更改为你的服务器地址。 现在,重新启动应用程序,然后单击按钮。 "Hello World"消息应该更改为德语。 你已经成功地将微型服务连接到主机应用程序 !

    要演示即时更新功能,请让应用程序和服务器运行。 现在,在服务器计算机上编辑 service.js 以使用不同的消息进行响应,然后保存:

    ...LiquidCore.emit( 'pong', { message:'Das ist super!' } )...

    返回应用程序并再次按按钮。 你的邮件应该更新。

    就是这样,这就是它的全部。 当然,这是一个过于简化的例子。 我们可以做其他有用的事情,比如利用现有的node.js 模块。 要尝试这里操作,请创建一个名为 bn.js的新文件,并将它的填充如下:

    var BigNumber =require('bignumber.js')setInterval(function() {}, 1000)LiquidCore.on( 'ping', function() {
     var x =newBigNumber(1011, 2) //"11"var y =newBigNumber('zz.9', 36) //"1295.25"var z =x.plus(y) //"1306.25"LiquidCore.emit( 'pong', { message:''+ x +' + '+ y +' = '+ z } )
     process.exit(0)
    })LiquidCore.emit( 'ready' )

    我们现在将使用 BigNumber MODULE。 请务必先安装它:

    
    % npm install bignumber.js
    
    
    
    

    你还需要在同一个目录中使用 Manifest 文件 bn.manifest:

    {
     "configs": [
     {
     "file":"bn.js" }
     ]
    }

    现在导航到浏览器中的http://localhost:8080/bn.js,现在你应该看到 bignumber.js MODULE 已经被包装了。

    在Hallo中,模具焊接应用程序,更改以下行:

    URI uri =newURI("http://"+serverAddr+"/service.js");

    到:

    URI uri =newURI("http://"+serverAddr+"/bn.js");

    然后重新启动应用程序。当单击按钮时,应该看到一个使用 MODULE的方程式。

    好的,最后一个小技巧。 让我们修改 bn.manifest 文件以包含转换。 替换为:

    {
     "configs": [
     {
     "file":"bn.js",
     "transforms": [ "uglifyify" ]
     }
     ]
    }

    你需要清除服务器高速缓存,因此只需使用 delete 目录:

    
    % rm -rf ~/helloworld/.lib
    
    
    
    

    然后重新启动服务器。 现在导航到 http://localhost:8080/bn.js 时,你将看到代码已经被缩小以节省空间。 Manifest 文件可以做很多事情,但是我们将保存它,因为它仍然处于初期。

    构建 LiquidCore Android库

    如果你对直接生成库和可能有贡献感兴趣,则必须执行以下操作:

    
    % git clone https://github.com/liquidplayer/LiquidCore.git
    
    
    % cd LiquidCore/LiquidCoreAndroid
    
    
    % echo ndk.dir=$ANDROID_NDK> local.properties
    
    
    % echo sdk.dir=$ANDROID_SDK>> local.properties
    
    
    %./gradlew assembleRelease
    
    
    
    

    你的库现在位于 LiquidCoreAndroid/build/outputs/aar/LiquidCore-release.aar 要使用它,只需将以下内容添加到你的应用程序 build.gradle:

    
    repositories {
    
    
     flatDir {
    
    
     dirs '/path/to/lib'
    
    
     }
    
    
    }
    
    
    
    dependencies {
    
    
     implementation(name:'LiquidCore-release', ext:'aar')//'compile' on older buildtools versions
    
    
    }
    
    
    
    
    注释

    node.js 库( libnode.so ) 预先编译并在 deps/node-8.9.3/prebuilt 中包含为二进制形式。 生成库所需的所有修改都包含在 deps/node-8.9.3 中。 要构建每个库的( 如果你选择),请参见这里的指令

    许可证

    版权( c ) 2014 -2018 Eric Lange。 保留所有权利。

    如果满足以下条件,则允许在源和二进制表单中重新分配和使用,以及不修改:

    • 以源代码形式重新发布必须保留未经修改的上述版权声明、本许可条件以及其后的免责声明。

    • 二进制表单中的with必须重现 上面 版权声明,这里条件列表和以下文件和/或者它的他材料中的声明。

    软件由版权持有者和贡献者"是"提供,包括明示或者默示担保,包括但不限于适销性担保和适用于特定用途的FITNESS和适合。 任何EVENT或者侵犯人,不论合同中出现的任何LIABILITY或者侵权情况,均不得承担任何直接。间接。偶然。特殊。范例或者侵权责任,即使通知可能发生此类损害。



    文章标签:JAVA  Javascript  BASE  micr  NAT  Native  envi  环境  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语