Sencha, the起名 nightmare!

java中native的用法

public static native void  java.lang.System.arraycopy(Object, int,
Object, int, int)方法照旧是native的,

查询了弹指间java中native的用法,找到如下小说,

学习了:https://www.cnblogs.com/b3051/p/7484501.html 

可是,本身手痒,写了弹指间,结果,填了多少个坑;

1,javah 在此以前从未行使过,用起来还算能够,中规中矩;

2,编写C文件也还足以;随便写,结果就挖了多少个坑;

3,使用cl编写翻译有些难点,有些文章说要安装Visio Studio 20XX,

学习了:http://blog.163.com/yuyang\_tech/blog/static/2160500832013118112049372/

支配动用vc6.0来做,

下载地址:http://www.pc6.com/softview/SoftView\_51072.html

解压至D:\pvc6\VC98\BIN,在加上到系统path中;

新兴发现自家把D:\pvc6\COMMON\MSDEV98\BIN;D:\pvc6\VC98\INCLUDE也加到路径里面了;忘记怎么了;

出错1:

D:\Java\gitworkspace\Coding\bin>CL.EXE -I%java_home%\include -I%java_home%\inclu
de\win32 -LD JavaNativeImp.c -Fehello.dll
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

JavaNativeImp.c
D:\Java\jdk1.8.0_05\include\jni.h(39) : fatal error C1083: Cannot open include f
ile: 'stdio.h': No such file or directory

千帆竞发模拟 -I参数,

CL.EXE -I%java_home%\include -I%java_home%\include\win32
-ID:\pvc6\VC98\INCLUDE -LD JavaNativeImp.c -Fehello.dll

出错2:

D:\Java\gitworkspace\Coding\bin>CL.EXE -I%java_home%\include -I%java_home%\inclu
de\win32 -ID:\pvc6\VC98\INCLUDE -LD JavaNativeImp.c -Fehello.dll
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

JavaNativeImp.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/dll
/implib:hello.lib
/out:hello.dll
JavaNativeImp.obj
LINK : fatal error LNK1104: cannot open file "LIBCMT.lib"

找不到参数能够加lib了,

学习了:http://blog.csdn.net/cruise\_h/article/details/29218407

在自己的计算机->属性->高级系统装置->环境变量->系统变量中新建系统变量LIB、INCLUDE并设置它们的值为:

LIB:D:\pvc6\VC98\LIB

INCLUDE:%java_home%\include;%java_home%\include\win32;D:\pvc6\VC98\INCLUDE

如此直白输入:cl -LD JavaNativeImp.c -Fehello.dll就足以编写翻译了;

输出:

D:\Java\gitworkspace\Coding\bin>cl -LD JavaNativeImp.c -Fehello.dll
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

JavaNativeImp.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/dll
/implib:hello.lib
/out:hello.dll
JavaNativeImp.obj
   Creating library hello.lib and object hello.exp

结果运转的时候报错;

出错3:

D:\Java\gitworkspace\Coding\bin>java com.stono.jvm.JavaNative
Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\Java\gitworkspace\
Coding\bin\hello.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(Unknown Source)
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at com.stono.jvm.JavaNative.<clinit>(JavaNative.java:6)

因为在Eclipse中运用了62个人的java,dll使用的是叁12位的;

学习了:https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform
只能把Java改成32位了;因为C语言64不熟悉;

重新用EditPlus写了Java文件,用32位jdk编译;

运作的时候报错,

出错4:

D:\>d:\java\jdk1.6.0_12\bin\java.exe JavaNative
Exception in thread "main" java.lang.UnsatisfiedLinkError: JavaNative.hello(Ljav
a/lang/String;)V
        at JavaNative.hello(Native Method)
        at JavaNative.main(JavaNative.java:7)

最开头认为是dll文件是原先的java程序生成的,就又重头跑了一遍;正是先javah
-jni xxx,然后写c文件,然后cl编写翻译;

结果要么出错4;

学习了:https://www.cnblogs.com/cuglkb/p/5665882.html 这几个办法没有测试;

http://blog.csdn.net/missingu1314/article/details/12650725
用的是那几个主意;

第1是因为在dll中,只怕xxx.h头文件中的接口名和xxx.cpp源文件中的完毕函数名区别导致的。

源码:

 

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JavaNative */

#ifndef _Included_JavaNative
#define _Included_JavaNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JavaNative
 * Method:    hello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_JavaNative_hello
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

#include <jni.h>
#include "JavaNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_JavaNative_hello(JNIEnv *env,jobject obj, jstring name){

    const char *str; 
    str = (*env)->GetStringUTFChars(env, name, NULL); 
    if (str == NULL) { 
        return; 
    } 

    printf("Hello World! %s \n", str );
    return;
}

C文件能够任由起名,可是方法必须和接口中的名字同样;

然后就又是cl编写翻译,然后java JavaNative就能够了;

Java源码:

public class JavaNative {
    public native void hello(String name);
    static{
        System.loadLibrary("hello");
    }
    public static void main(String[] args) {
        new JavaNative().hello("jni");
    }
}

 

基础

创造贰个应用程序

sencha -sdk /path/to/sdk generate app %name% /path/to/app

跑起来

cd /path/to/app

sencha app watch

放心,出错了会出红字,本人退回命令行。

开浏览器,暗中同意地址是 http://localhost:1841

在 watch
形式下,任何对源程序的修改都会自动更新,方便马上来看作用。看起来还挺方便,可是因为过于的
js 对象化包装,使得 Sencha
的采用调节和测试起来最好费劲。生产化打包编译今后,更是唯有三个app.js,万一出错了的话,你是找不到源头的了。

 

目录结构

根本注意上边多少个文件夹

app

与具体平台、设备分辨率非亲非故的东东。比如下边要涉及的数据模型、Store。

想法挺好,不过缺少 IDE 援救的情事下(其本人的开发工具还不帮忙 6.0.2
版本的 Sencha),在每一个目录以内跳转切换是可怜劳碌的。固然用了 file
buffer,你也得记住文件 id。

classic

经文 :) 听上去像极了 IIS
Classic。正是传统的网页应用程序。写页面视图就在那边,也是暗中认可的落到实处。

modern

当代,与经典对应。平板和触碰设备用。

packages

自定义的顺序包,比如宗旨,就位于那里。私下认可的界面宗旨假如不能满意急需,那么就足以自定义核心。纵然自定义是不行难受的。

resources

图形,通用的文本放在那里。

 

数据

Model

模型,或许叫数据模型,能够看做数据仓库储存款和储蓄的构造映射。

概念二个数据模型,继承自 Ext.data.Model

Ext.define(“Inventory.model.Band”,{
    extend:’Ext.data.Model’,
    fields:[
        {name:’Id’, type:’int’},
        {name:’Start’, type:’float’,allowBlank:false },
        {name:’End’, type:’float’,allowBlank:false},
        {name:’Wavelength’, type:’string’,allowBlank:false }
    ]
});

顺便说一句,用差异文件夹来存放同一个作用模块各样不一致组件的做法充足滞后。那本是用
IDE
和命名规范能够自由化解的标题。而在类名里面添加文件夹的构造,则进一步多余:多连续可能引用、完结抽象类的时候,两个公文夹结构你怎么放、怎么起名?

 

Store

存储。其实是储存代理的概念,即,从哪个地方读取数据,又将数据写回哪个地方。

其 load
函数在数额读取落成后回调,能够对回到的数量做尤其处理,相比便于。需求绑定数据模型使用。

proxy 属性指明了实际展开数据库(存取)操作的劳务地点,那里也就出了
Sencha 的圈儿了,Spring 也得以、ASP.NET 也得以,随意。

Ext.create(‘Ext.data.Store’,{
    model:’Inventory.model.Band’,
    id:’remotestore’,
    proxy:{
        type : ‘rest’,
        url:’http://localhost:40544/Band.svc/GetBands‘,
        reader : {
            type : ‘json’,
            rootProperty : ‘d’
        }
    },
    listeners:{
        load:function ( pageStore, records, successful , pageOperation ,
eOpts ){
            var bs = {bands:[]};
             for(var i=0;i<records.length;i++){
                 bs.bands.push(records[i].data);
             }
            Ext.getStore(‘bandstore’).setData(bs);
        }
    }
});

ViewModel

视图模型,即对页面上所放字段的映射。能够是数据模型的一有的,也能够是八个涉及数据模型的整合。但其实
Sencha 这么搞,是把不难难点弄复杂了,因为 html
页面本身就有表单和字段,直接 parse
其键值对即可;而近年来则必须再重复定义3次这几个字段,等于同样的定义在 html
表单和模型视图里面分别写了一回,重复了。

概念一个视图模型

Ext.define(‘Inventory.view.main.MainModel’, {
    extend: ‘Ext.app.ViewModel’,
    alias: ‘viewmodel.main’,
    data: {
        name: ‘Inventory’
    }
});

采纳的时候,首先在页面里面表达要用到的视图模型是哪位,然后对页面上得以
set 的个性绑定视图模型的字段,比如上面这一个,绑定页面包车型地铁标题:

viewModel: ‘main’,
header: {
    title: {
        bind: {
            text: ‘{name}’
        }
    }
}

 

视图

位于页面上的可视区域,用来显示内容、提供相互操作。类似 SharePoint 上边的
WebPart。不过 WebPart
的本意是让用户也得以自定义页面(那么些想法也是挺天真),视图则是让程序员来自定义页面(这几个想法更是清白)。

开创二个新视图,名字叫 band.Band,不过放在 main
文件夹里面。那正是自作者前面说的,文件夹归类法不可信赖的地点。

Ext.define(‘Inventory.view.band.Band’, {
    extend: ‘Ext.panel.Panel’,
    xtype: ‘bandview’,
    items :[
        {html:'<h2>hello!</h2>’}
    ]
});

大家也得以用事先定义的视图模型来动态地出示点儿内容:

Ext.define(‘Inventory.view.band.Band’, {
    extend: ‘Ext.panel.Panel’,
    xtype: ‘bandview’,
    viewModel: ‘main’,
    items :[
        {bind:{html:'<h2>hello,{name}!</h2>’}}
    ]
});

表单

下边来贰个复杂点儿的视图模型绑定,将 band 绑定到叁个表单 form 上边:

{
    xtype: ‘form’,
    defaultType: ‘textfield’,
    viewModel: ‘band’, //this viewModel will provide default values.
    margin: ‘5, 0, 20, 0’,
    items:[
        { name: ‘Id’, fieldLabel: ‘Id’, readOnly: true, bind: { value:
‘{Id}’} },
        { name: ‘Wavelength’, fieldLabel: ‘Wavelength’, bind: { value:
‘{Wavelength}’} },
        { name: ‘Start’, fieldLabel: ‘Start’, bind: { value: ‘{Start}’}
},
        { name: ‘End’, fieldLabel: ‘End’, bind: { value: ‘{End}’} },
        { name: ‘Reset’, text: ‘Reset’, xtype: ‘button’, handler:
function() { var form = this.up(‘form’).getForm(); form.reset(); } }
    ]
}

滚动条

部分时候表单内容太多会抢先窗口范围,此时得以用滚动条属性(又四个再一次的阐发):

scrollable: true

列表

列表可以用 store 绑定,哪怕这几个 store 是从内部存款和储蓄器里面读取的预订义的数据。

Sencha
的文书档案里面对那种绑定描述甚少,值得批评。上面包车型客车事例,当选取一条记下的时候,自动将当选的值填充到前边的
form 里面。

//a grid, using store to retreive data
{
    xtype: ‘grid’,
    border: true,
    width: 600,
    store: {type: ‘bandstore’ },
    columns: [
        { text: ‘Id’,  dataIndex: ‘Id’, width:100 },
        { text: ‘Wavelength’,  dataIndex: ‘Wavelength’, width:200 },
        { text: ‘Start’, dataIndex: ‘Start’, flex: 1, width:100 },
        { text: ‘End’, dataIndex: ‘End’, flex: 1, width:100 }
    ],
    listeners: {
        selectionchange: function(sm, selections){
            if(selections.length==0)return;
            var form = this.up(‘panel’).down(‘form’).getForm();
            form.setValues(selections[0].data);
        }
    }
}

本来,这不是列表和表单的常用方法,只是基础。前面 Jony
会提供更复杂的玩儿法。

高档绑定

比如说,上边的百般 listeners 里面包车型大巴 selectionchange
方法,其实是足以去掉的,只要这么写:

Ext.define(‘Inventory.view.band.Band’, {
    extend: ‘Ext.panel.Panel’,
    xtype: ‘bandview’,
    viewModel: ‘main’,
    items :[
        //a random message showing viewmodel binding
        { bind: { html: ‘<h2>hello,{name}!</h2>’ } },
        //a form, with viewmodel binding as well
        {
            xtype: ‘form’,
            defaultType: ‘textfield’,
            margin: ‘5, 0, 20, 0’,
            items:[
                { name: ‘Id’, fieldLabel: ‘Id’, readOnly: true , bind: {
value: ‘{bandgrid.selection.Id}’} },
                { name: ‘Wavelength’, fieldLabel: ‘Wavelength’ },//,
bind: { value: ‘{Wavelength}’} },
                { name: ‘Start’, fieldLabel: ‘Start’ },//, bind: {
value: ‘{Start}’} },
                { name: ‘End’, fieldLabel: ‘End’ },//, bind: { value:
‘{End}’} },
                { name: ‘Reset’, text: ‘Reset’, xtype: ‘button’,
handler: function() { var form = this.up(‘form’).getForm();
form.reset(); } }
            ]
        },
        //a grid, using store to retreive data
        {
            xtype: ‘grid’,
            reference: ‘bandgrid’,
            border: true,
            width: 600,
            store: {type: ‘bandstore’ },
            columns: [
                { text: ‘Id’,  dataIndex: ‘Id’, width:100 },
                { text: ‘Wavelength’,  dataIndex: ‘Wavelength’,
width:200 },
                { text: ‘Start’, dataIndex: ‘Start’, flex: 1, width:100
},
                { text: ‘End’, dataIndex: ‘End’, flex: 1, width:100 }
            ]
        }
    ]
});

Sencha 的构思,是用编程的法子来粘合 Web
应用程序的组件,所以安排属性就能干活是最好的,Sencha
的框架本人掌握如何找到涉嫌数据并联系起来。

嗯,想得挺好的。这么做有三个前提:有全体的宏图,且差不多不会转移。

 

调试

只要不幸地,你的 Sencha 项目被集成进了某些服务器环境(比如
weblogic),那么,单独开1个互动的同类 Sencha 应用就变得老大管用了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图