最近一直在学习jquerymobile,但是只是学了jquerymobile却没什么大用处,所以从今天开始学下phonegap。
phonegap的介绍就不说了,现在的版本已经到2.4了,我使用最新的2.4搭建的环境,步骤如下:
1 安装eclipse,具体自己上网搜
2 下载android-sdk,安装adt,这个也自己去网上搜。
3 下载phonegap2.4,并解压。
4 新建一个android项目,我建的项目是基于android4.0的,基本上就一路next就可以了。
5 找到此目录:phonegap-2.4.0\lib\android\example。将源项目中的assets、res、src目录中的东西删除,然后再讲phonegap给的这个例子中的东西拷到对应的目录下。将libs目录下的文件也要拷贝到工程libs下。使用phonegap给的项目中的AndroidManifest.xml替换工程中的AndroidManifest.xml。此时这个功能就搭建好了。
新建一个模拟器,然后在项目上右键--->run as--->android application。当模拟器中出现devices is ready的时候说明配置好了。
我也是刚开始接触到phonegap,所以许多东西都还不熟。既然使用了phonegap就是为了使用javascript和html开发,所有的这些代码都放在assets/wwww目录下,所以只要配置好了环境基本只要修改这个目录下的东西就可以了。至少我目前是这样理解。
本文将详细记录如何在一个全新的Ubuntu系统中安装及配置Gerrit服务器的相关详细步骤。
1.安装Ubuntu12.xx(本人使用的是12.10,其他版本未测试)
2.配置java环境
下载jdk-6u34-linux-x64.bin(百度google),终端中执行安装(如没有权限,则执行 chmod a+x jdk-6u34-linux-x64.bin)
$: ./jdk-6u34-linux-x64.bin
安装会自动执行。安装完后,配置相关环境变量
$: vim ~/.bashrc
添加如下环境变量:(username为您的用户名)
JAVA_HOME=/home/username/jdk1.6.0_34 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
$: source ~/.bashrc
验证是否配置成功:
$: java -version
$: javac
如果以上终端命令没有返回错误,且有正常的版本信息及help信息,则证明JAVA环境配置成功,可以继续。如有错误,请自行百度google。
3.配置Gerrit.xxx.war
打开终端,到达gerrit.xxx.war所在目录,执行:
$: java -jar gerrit.xxx.war init -d review_site
Create '/home/username/review_site' [Y/n]?
...
基本就是一路回车下去,默认的配置就好,需要说的一点就是验证方式OPENID,OPENID可以采用google及yahoo邮箱登录,但是某些时候由于GFW的原因,这些可能不好用,所以就可以选择http(推荐)。 管理的数据库类型也因人而异,喜欢什么就用什么,默认为H2.
配置完成后,会自动调用gerrit.sh脚本开始gerrit服务,且会自动打开浏览器,这个时候一定是失败的,因为还没有配置apache2.
在配置apache2之前需要对gerrit的配置文件进行小小的修改,该文件为review_site/etc/gerrit.config
将字段[gerrit]下的canonicalWebUrl改为https://127.0.0.1:8081/
将字段[httpd]下的listenUrl改为 proxy-https://127.0.0.1:8081/
保存即可。
4.配置apache2
终端执行:
$: sudo apt-get install apache2
会进行安装,少许等待即可。另,本人用的是163的镜像软件源,感觉速度还是很不错的。
apache2在ubuntu上安装完后是没有httpd.conf这个配置文件的,去/etc/apache2/下看一看究竟
创建httpd.conf文件(当然,需要root权限的),录入以下内容:
<VirtualHost *> ServerName localhost ProxyRequests Off ProxyVia Off ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> <Location /login/> AuthType Basic AuthName "Gerrit Code Review" AuthBasicProvider file AuthUserFile /home/username/review_site/etc/passwords Require valid-user </Location> ProxyPass / http://127.0.0.1:8081/ </VirtualHost>
这个配置文件的意思是,当访问任意(*)时,进行代理,代理到/login/目录,并根据AuthUserFile请求用户名及密码,最终代理为http://127.0.0.1:8081/
这里有两个重点需要说一下:
a.关于review_site/etc/passwords
打开终端,进入review_site/etc目录下,执行:
$: touch passwords
$: htpasswd passwords gerrit
会请求你输入此用户(gerrit)的密码,确认无误后将相关信息写入passwords文件中。这个用户名及密码就是你稍后访问本地搭建的gerrit服务器所需要的。
b.ProxyPass / http://127.0.0.1:8081/
自此应与gerrit.config中字段[httpd]的配置对应相同,必须。
配置完后,保存该文件。
别高兴的太早,还没有完,现在这个配置文件只是写玩了而已,并没有生效。打开apache2.conf一看究竟吧。
你会发现apache2.conf这个文件通过Include来引用其他配置文件,但是并没有httpd.conf,仿照其他Include将httpd.conf也引用进去。
Include httpd.conf
保存,退出。
no,还没有完。
如果现在就着急重启apache2服务的话会发现出现proxy相关错误。是因为apache2的proxy模块还没有开启,通过查看apache2.conf也能够发现,mods-enable文件夹下的被引用了,但是在这里并没有发现proxy相关模块,在mods-available中却有。通过ls -l发现enable下边的功能都是link过来的,ok,也link过来吧。
通过ln -s 命令将proxy.conf proxy.load proxy_http.load从available中link到enable中即可。
大功告成,执行:
$: sudo /etc/init.d/apache2 restart
重启apache2服务。
现在打开服务器,登录127.0.0.1出现gerrit界面。
OVER.
PS:容易出现的错误
1.未修改apache2.conf引用,导致httpd.conf未生效
2.httpd.conf中VirtualHost字段后将*写成与127.0.0.1:8081相同,这里的意思是输入,后边的才是代理“到”的端口。
这一篇讨论在c/c++代码里生成java对象,访问修改其字段、调用其方法。编译和运行流程参见上一篇。
这里写两个java类:JniFuncMain和JniTest。
1.在JniFuncMain是主类。里面有一个静态整形字段。
2.仍然按照常规流程用static block加载dll库。
3.而且还声明了一个本地方法--注意static属性。返回一个JniTest对象。对象的构造过程在createJniObject()的本地函数调用java构造方法执行。
public class JniFuncMain { private static int staticIntField = 200; // 加载本地库jnifunc.dll static{ System.loadLibrary("jnifunc");} public static native JniTest createJniObject(); public static void main(String[] args) { System.out.println("[java]: createJniObject() call native method!"); JniTest jniObj = createJniObject(); jniObj.callTest(); } } class JniTest { private int intField; // 构造方法 public JniTest( int num ) { intField = num; System.out.println("[java]:JniTest' constructor been called! init intField =" + num); } // 此方法由本地代码调用 public int callByNative(int num) { System.out.println("[java]: i be called by native code! set intField = " + num); return num; } public void callTest() { System.out.println("i be called by java code!"); return; } }
本地c++代码实现createJniObject函数:
#include "JniFuncMain.h" // 注意用javah命令生成 #include <stdio.h> JNIEXPORT jobject JNICALL Java_JniFuncMain_createJniObject(JNIEnv *env, jclass clazz) { jclass targetClass; jmethodID mid; jobject newObject; jstring helloStr; jfieldID fid; jint staticIntField; jint result; // 获得JniFuncMain类的staticIntField变量值 fid = env->GetStaticFieldID(clazz, "staticIntField", "I"); staticIntField = env->GetStaticIntField(clazz, fid); printf("[cpp]get JniFuncMain private field staticIntField value\n"); printf(" JniFuncMain.staticIntField = %d\n", staticIntField); // 查找要访问的成员所在的类 targetClass = env->FindClass("JniTest"); // 查找构造方法 mid = env->GetMethodID(targetClass, "<init>", "(I)V"); // 1."(I)V"是用javap反编译工具反编译JniTest的成员 // 获得的签名。GetMethodID方法会根据此签名找到该方法。 // 反编译class文件命令,例子: javap -s -p 类名 // 2. 第一个参数不是JNIEnv*类型是因为此代码是c++代码。原理类似于this指针。 // 3. 只有获得构造方法时第2个参数是<init>,其他的,直接传入方法名称即可。 // 生成JniTest对象 printf("[cpp]JniTest object generate...\n"); newObject = env->NewObject(targetClass, mid, 100); // 调用jniTest对象的方法返回一个值,本地打印出来 mid = env->GetMethodID(targetClass, "callByNative", "(I)I"); result = env->CallIntMethod(newObject, mid, 200); // 再调用一下jni设置字段的方法 fid = env->GetFieldID(targetClass, "intField", "I"); printf("[cpp]:set JniTest object field intField = 200\n"); env->SetIntField(newObject, fid, 200); return newObject; }
结果如下: