OpenWRT开发之——目录分析与make过程

1.目录介绍

有几个重要目录:package, target, build_dir, staging_dir, bin, dl, …

—include 目录是存放 *.mk 文件。这里的文件上是在Makefile里被include的

—build_dir/host 目录是建立工具链时的临时目录

—build_dir/toolchain-<arch>* 对应硬件的工具链的目录

—staging_dir/toolchain-<arch>*  是工具链的安装位置

—target/linux/<platform> 目录里面是各个平台(arch)的相关代码

—target/linux/<platform>/config-3.10 文件就是配置文件了

—dl 目录是’download’的缩写, 在 编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编 译即可。编译时,会将软件包解压到build_dir目录下。

—build_dir/ 目录下进行解压,编译和打补丁等。

—package/ 目录里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。

在openwrt中ipk就是一切, 我们可以使用:

$ ./scripts/feeds update #来对软件包进行更新.
$ ./scripts/feeds search nmap #查找软件包'nmap'
Search results in feed ’packages’: 
nmap       Network exploration and/or security auditing utility
$ ./scripts/feeds install nmap #安装'nmap'这个软件

—feeds/packages 为执行./scripts/feeds install 之后的package。

—bin 目录下生成了很多bin文件,根据不同的平台来区分。

—bin/<platform>/package 目录里面有很多ipk后缀的文件,都是package目录下的源码在build_dir目录下编译后的生成的结果。

注:以上摘自:[openwrt框架分析]

2.包的make过程

比如:lua包,mips架构。

make步骤:

  1. 在 make 时,make 读取到 package/utils/lua/Makefile 文件内容。
  2. 如果git或svn源,那么就会在 tmp/dl/ 目录下将源代码 clone 下来。然后,将 clone 下来的源码删除 .git 或 .svn 目录删除,然后压缩成 lua-1.5.1.tar.gz 文件,并复制到 dl/ 目录下。
  3. 在编译前段,将 dl/ 目录下的 lua-1.5.1.tar.gz 文件解压到 build_dir/target-mips_<board>/ 目录下。
  4. 进入 build_dir/target-mips_<board>/lua-1.5.1/
  5. ./configure,make,make install。
  6. make install 会将生成的二进制文件安装到 build_dir/target-mips_<board>/lua-1.5.1/ipkg-ar71xx/ 目录下。
  7. 最后将 build_dir/target-mips_<board>/lua-1.5.1/ipkg-ar71xx/ 打成包成lua-5.1.5-1_ar71xx.ipk,并复制到 bin/ar71xx/packages/base/ 。出处:https://my.oschina.net/hevakelcj/blog/417402

mvn 报错 The parameters ‘mainClass’

[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:java (default-cli) on project test_artifact: The parameters ‘mainClass’ for goal org.codehaus.mojo:exec-maven-plugin:1.6.0:java are
missing or invalid -> [Help 1]

因为插件还没配置,注意配置引导路径
解决方法:在pom文件添加如下代码  EchoServer 为包含main的类

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>EchoServer</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

Android onClick 写法

package com.hello;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class AActivity extends Activity {
/** Called when the activity is first created. */

EditText Ev1;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Ev1 = (EditText)findViewById(R.id.editText1);

//第一种方式
Button Btn1 = (Button)findViewById(R.id.button1);//获取按钮资源
Btn1.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
String strTmp = “点击Button01″;
Ev1.setText(strTmp);
}

});

//第二种方式
Button Btn2 = (Button) findViewById(R.id.button2);//获取按钮资源
Btn2.setOnClickListener(listener);//设置监听

}

Button.OnClickListener listener = new Button.OnClickListener(){//创建监听对象
public void onClick(View v){
String strTmp=”点击Button02″;
Ev1.setText(strTmp);
}

};
//第三种方式(Android1.6版本及以后的版本中提供了)
public void Btn3OnClick(View view){
String strTmp=”点击Button03”;
Ev1.setText(strTmp);

}
}

android studio 新建项目报错 Failed to resolve: junit:junit:4.12

android studio 新建项目报错如下:

(27,17) Failed to resolve: junit:junit:4.12

Failed to resolve: javax.inject:javax.inject:1

Failed to resolve: javax.annotation:javax.annotation-api:1.2

Failed to resolve: com.google.code.findbugs:jsr305:2.0.1

Failed to resolve: org.hamcrest:hamcrest-library:1.3

Failed to resolve: org.hamcrest:hamcrest-integration:1.3

Failed to resolve: com.squareup:javawriter:2.1.1

解决办法:

注释gradle文件中的

compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" (可删可不删的)

Jfinal 里直接用dao或Db

Jfinal 里直接用dao或Db

需要启动DruidPlugin和ActiveRecordPlugin插件

然后start();

代码如下:

public static void startPlugin() {
PropKit.use(“config_jdbc.txt”);
DruidPlugin druidPlugin = new DruidPlugin(PropKit.get(“jdbcUrl”), PropKit.get(“user”), PropKit.get(“password”).trim());
ActiveRecordPlugin arp = new ActiveRecordPlugin(“mysql”,druidPlugin);
_MappingKit.mapping(arp);

druidPlugin.start();
arp.start();
}
然后再main方法里:

public static void main( String[] args ) {
startPlugin();
System.out.println(Db.queryStr(“select ‘hello’ from dual”));
}

Tomcat 内存配置

设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。

可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置

三、实例,以下给出1G内存环境下Java jvm 的参数设置参考:

JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true ”

JAVA_OPTS=”-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: NewSize=192m -XX:MaxNewSize=384m”

CATALINA_OPTS=”-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m”

Linux

在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh添加:

JAVA_OPTS=’-Xms512m -Xmx1024m’要加“m”说明是MB,否则就是KB了,在启动tomcat时会 报内存不足。

-Xms:初始值-Xmx:最大值-Xmn:最小值

Windows

在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m

如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.

但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.

JFinal 部署在tomcat下

环境配置就不说了,JFinal项目和java web项目本质上是一样的,所以部署方式也是相同的

1 进入/var/www目录,解WAR包,目录下会有WEB-INF,META-INF 等文件夹

2 修改  TOMCAT_HOME/conf/ server.xml 文件找到 Host 标记,在其中添加如下子标记:

<Context path=”” docBase=”/var/www” reloadable=”false” />

3 注意 Host 标记中的 appBase 属性不要去修改,让其为默认值 “webapps”

4 启动 tomcat

注意点:

1 不要把项目部署在TOMCAT_HOME/webapps 目录下,避免 tomcat 加载项目两次的坑,这个坑会引发一些莫名奇妙的问题,例如:老版本的tomcat中,多人同时登录后session产生混乱

2 以上配置中的 Context 标记的 path 属性一定要设置为 “” 而不是 “/”,否则也会跳入一个坑。 docBase 属性后面放项目名称的绝对地址

mysql与JFinal的数据关系

MySQL与jfinal在使用过程中,一定要弄清楚数据关系,否则容易发生类型不匹配的错误。

一、关系整理

为此,我根据jfinal的源码和mysql的数据字段类型,整理列表如下:

mysql                                                                                                jfinal                  例子                      编号
varchar, char, enum, set, text, tinytext, mediumtext, longtext                          String          getStr(“xxx”)          0001
int, integer, tinyint(n) n > 1, smallint, mediumint                                                     int             getInt(“xxx”)    0002
bigint, unsign int                                                                                                             long getLong(“xxx”) 0003
unsigned bigint                                                                                                            BigInteger getBigInteger(“xxx”) 0004
date, year                                                                                                                       Date getDate(“xxx”) 0005
time                                                                                                                                 Time getTime(“xxx”) 0006
timestamp, datetime                                                                                                   Timestamp getTimestamp(“xxx”) 0006
real, double                                                                                                                   Double getDouble(“xxx”) 0007
float                                                                                                                                 Float getFloat(“xxx”) 0008
bit, tinyint(1)                                                                                                                 Boolean getBoolean(“xxx”) 0009
decimal, numeric                                                                                                         BigDecimal getBigDecimal(“xxx”) 0010
binary, varbinary, tinyblob, blob, mediumblob, longblob                                   byte[] getBytes(“xxx”) 0011
extends from Number                                                                                                 Number getNumber(“xxx”) 0012
二、tinyint

在mysql中,tinyint(n)中的n对jfinal的数据转换有影响:

n>1时,jfinal要使用getInt。
n=1时,jfinal要使用getBoolean。
三、unsigned

在mysql中unsigned表示有无符号,举例来说:

unsigned int,表示数据>0,不包含负数,那么jfinal就要使用getLong。
unsigned bigint,表示数据>0,不包含负数,那么jfinal就要使用getBigInteger。
四、int(m)

关于mysql中int(m)中的m,这当然包含bigint(m)的m。

int[(m)]
有符号值:-2147683648 到2147683647(- 231 到231- 1)
无符号值:0到4294967295(0 到232 – 1) 4个字节
这意味着,如果你的数据字段是这样子的话

`uid` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘用户id’
1
1
那么m=11是正确的,因为考虑到“-”(负数),长度最大为11位。

而如果你的数据字段是这样子的话

`uid` int(11) unsigned NOT NULL COMMENT ‘用户id’
1
1
那么m=11是没有意义的,因为最大长度为10位,如果你比较专业的话,此时,你的数据字段就应该是这样子的

`uid` int(10) unsigned NOT NULL COMMENT ‘用户id’
1
1
五、jfinal的api

只看如下代码:

/**
* Get attribute of mysql type: int, integer, tinyint(n) n > 1, smallint, mediumint
*/
public Integer getInt(String attr) {
return (Integer)attrs.get(attr);
}

/**
* Get attribute of mysql type: bigint, unsign int
*/
public Long getLong(String attr) {
return (Long)attrs.get(attr);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

1
2
3
4
5
6
7
8
9
10
11
12
13
方法很详细的介绍了应该匹配哪一种mysql数据类型。