星期二, 十月 15, 2013

如何得到Android自带的sqlite的版本?

代码getv.c:
#include <stdio.h>
#include "sqlite3.h"
main()
{
printf("version is %s\n",sqlite3_libversion());
printf("sqlite3_sourceid is %s\n",sqlite3_sourceid());
}
将Android设备/system/lib/libsqlite.so复制到本地编译链接的需要参考,或者自己编译新的版本.参看NDK编译sqlite共享库及命令行读取数据库程序

Androkd.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := getv
LOCAL_SRC_FILES :=  getv.c
LOCAL_LDLIBS := -L. -lsqlite
include $(BUILD_EXECUTABLE)
得到ibs\armeabi\getv执行文件,使用adb push复制到android设备上,chmod 755 getv 后,执行
即可:android 4.3自带的sqlite版本为:
version is 3.7.11
sqlite3_sourceid is 2012-03-20 11:35:50 00bb9c9ce4f465e6ac321ced2a9d0062dc364669

星期四, 十月 10, 2013

编译sqlite 用于Android NDK

2.在一个目录下sqlitendk 建立jni目录,将三个文件展开到该目录下,并新建一个空白的
  Android.mk文件,目录结构
d:\sqlitendk
|
├─jni
│      Android.mk
│      sqlite3.c
│      sqlite3.h
│      sqlite3ext.h


3.修改Android.mk包含如下内容:
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := sqlite3802
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := sqlite3.c

include $(BUILD_SHARED_LIBRARY)


回到jni的上级目录,sqlitendk,运行%NDK_HOME%\ndk-build.cmd
编译开始,最后生成 d:\sqlitendk\libs\armeabi\libsqlite3802.so
├─libs
│  └─armeabi
│          libsqlite3802.so

在Android NDK c文件中包含 sqlite3.h 即可使用sqlite的全部功能了。
将编译好的libsqlite3802.so和sqlite 头文件 sqlite3.h复制到将要使用的
例子的jni目录下,并建立Android.mk文件,指明 libsqlite3802.so所在目录,
然后调用ndk-build或ndk-build.cmd编译即可生成db 运行文件,
需要将 db和libsqlite3802.so都是用adb push复制到手机上,并修改
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:libsqlite3802.so所在目录
然后修改db权限可执行,运行即可。

附件为一个读取android /data/data/目录下某个应用的数据库的例子。
 dbtype.h
#ifndef DBTYPE_H_INCLUDED
#define DBTYPE_H_INCLUDED
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlite3.h"

#define DB_PATH "/data/data/home.sunose/databases/doubleball.db3"

#define MAX_REDBALL 33 //最大双色球红球

#define  MAX_BLUEBALL 16 //最大双色球篮球球
#define  REDBALL_NUMBER 6 //最多红球数目
#define STDCALL __stdcall

static char QUERY_DB[]="SELECT * FROM _DBHISTORY order by term asc";;
 

例子db.c
#include "dbtype.h"
#include <stdio.h>

    char *zErrMsg;
    int rc;
    int db_open;   
         char **records;//所有记录
     int nrow;
     int ncol;
     sqlite3 *db;
//pre declare    
     int query(char * sql);

int main()
{
char  result[1024*1024];//1M
char buf[80];
char number[16];
   
 printf("this is %d\n",MAX_REDBALL);
 printf("this is %s\n",DB_PATH);
 rc = sqlite3_open(DB_PATH, &db);
   if(rc!=SQLITE_OK)
    {
    printf("%s ",zErrMsg);
    }    
    query(QUERY_DB);
    int i=0,j=0;
for(i=1;i<=nrow;i++)//line,注意,recoreds包含了列名字
   {
       strcpy(buf,"[");
    for(j=0;j<ncol;j++)
   {
                     if(j==0 || j==1) //term and date time
                         {
                        sprintf(number,"'%s'",(records[i*ncol+j]));                           
                  strcat(buf,number);
                  }
                     if(j>1) //term and date time
                         {
                  sprintf(number,"'%02s'",(records[i*ncol+j]));
                  strcat(buf,number);
                  }
                  if(j<(ncol-1))
                   {
                       strcat(buf,",");
                }
   }
    strcat(buf,"],\n");           
  strcat (result,buf);                 
      }  
printf("%s",result);      
}
int query(char * sql)
{
zErrMsg=NULL;
        rc = sqlite3_get_table
        (
              db,              /* An open database */
              sql,       /* SQL to be executed */
              &records,       /* Result written to a char *[]  that this points to */
              &nrow,             /* Number of result rows written here */
              &ncol,          /* Number of result columns written here */
              &zErrMsg          /* Error msg written here */
              );
if(zErrMsg!=NULL)
{

  printf("%s",zErrMsg);
  zErrMsg=NULL;
}

        return rc;
}


Android.mk:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := db
LOCAL_SRC_FILES := db.c
LOCAL_LDLIBS := -LD:/test_Projects/testc/ -lsqlite3802
include $(BUILD_EXECUTABLE)

星期二, 九月 24, 2013

Android 命令行 dx转换格式出现 file not found

解决方法不要用相对路径,要用绝对路径。
dx默认将dx.bat或dx.sh所在目录作为主目录。语法类似如下

dx --dex --no-strict --output=c:\temp\cmd.jar c:\temp\testCMD.class

星期三, 九月 11, 2013

7zip lzma 移植到Android ndk

1) 下载LZMA-SDK源码包,下载地址:http://www.7-zip.org/sdk.html,当前最新版本是9.20,即lzma920.tar.bz2包;

2) 解压:把源码包的程序文件解压到文件夹:lzma920中;

3) 解压后,建议先查看下其中的说明文件:7zC.txt和lzma.txt两文件;

4) 进入目录:lzma920/C/Util/7z,可以看到其中有两个makefile文件:makefile和makefile.gcc,因为是在linux下,所以用makefile.gcc这个makefile文件;

5.lzma920目录下新建jni目录
将 lzma920\C\目录下所有c和.h文件复制到jni目录下,不包含util子目录
6.在jni目录下建立Android.mk文件,包含如下内容:
LOCAL_PATH:= $(call my-dir)
#LOCAL_CXX := $(CXX)
include $(CLEAR_VARS)

#LOCAL_C_INCLUDES :=
LOCAL_MODULE    :=  7zDec
LOCAL_CFLAGS    :=   -c -O2 -Wall  -flto -dM
LOCAL_SRC_FILES :=  7zAlloc.c \
7zBuf.c \
7zBuf2.c \
7zCrc.c \
7zDec.c \
7zIn.c \
7zFile.c \
7zStream.c \
7zCrcOpt.c \
CpuArch.c \
LzmaDec.c \
Lzma2Dec.c \
Bra.c \
Bra86.c \
Bcj2.c \
Ppmd7.c \
Ppmd7Dec.c


LOCAL_LDLIBS    := -llog
##LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(BUILD_SHARED_LIBRARY)

在lzma920目录下执行ndk-build.cmd命令

此时出现一些类型没有定义错误,可以在types.h中加入如下申明,
重新编译即可.


Types.h

//port start
typedef void *PVOID,*LPVOID;
typedef void *HANDLE;
typedef unsigned long DWORD;
/*WINNT.H*/
typedef long LONG;
typedef unsigned short WORD;

typedef struct _LIST_ENTRY {
    struct _LIST_ENTRY *Flink;
    struct _LIST_ENTRY *Blink;
} LIST_ENTRY,*PLIST_ENTRY;
typedef struct _CRITICAL_SECTION_DEBUG {
    WORD Type;
    WORD CreatorBackTraceIndex;
    struct _CRITICAL_SECTION *CriticalSection;
    LIST_ENTRY ProcessLocksList;
    DWORD EntryCount;
    DWORD ContentionCount;
    DWORD Spare [2];
} CRITICAL_SECTION_DEBUG,*PCRITICAL_SECTION_DEBUG;

typedef struct _CRITICAL_SECTION {
    PCRITICAL_SECTION_DEBUG DebugInfo;
    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;
    HANDLE LockSemaphore;
    DWORD SpinCount;
} CRITICAL_SECTION;

//port over

星期五, 九月 06, 2013

fastboot devices和adb devices

adb devices 可以列出设备,但是fastboot devices无法列出。
原因是工作原理不同。
adb devices和fastboot不能同时工作。
使用adb reboot bootloader 启动 手机后,出现android 系统提示的时候,
这个时候,使用fastboot devices就出现设备了,这个时候
就可以刷机了。
比如:
fastboot flash recovery openrecovery-twrp-2.6.1.0-maguro.img

星期四, 八月 15, 2013

巧妙在底部中间对齐.

     <div style="position: absolute; left: 50%;bottom: 0;">
        <div style="position: relative; left: -50%;font-size:24px;bottom: 0;">
          Version here!haha.
        </div>
    </div>

星期三, 八月 14, 2013

Gradle项目里调用ant的propertyFile task 用来制作build number

文件:buildnumber.gralde包含代码

task buildversionnumber << {

ant.propertyfile(file: "src/build.properties")
{
 entry(key: 'builder.date', type:'date',value: new Date(),pattern:'YYYY/MM/dd  HH:mm')
 entry(key: 'build.number', value: '1',operation:'+',type:'int')
 }
 }

src\build.properties 文件里包含内容:

build.number=455
builder.date=2013/08/14  15\:22
builder.author=William Wang

运行:
gradle -b bnumber.gradle buildversionnumber

即可看到builder.date和build.number如期改变了。

星期五, 八月 09, 2013

cordova 生成Android mobile的奇怪约束.否则会无法生成build.xml

C:\npm>cordova create HWLauncher  com.projectname projectname

 cordova create path id name的参数格式。

C:\npm>cd HWLauncher

C:\npm\HWLauncher>cordova platform add android
dir platforms\android,如果这个时候没有看到build.xml和AndroidManifest.xml
则说明出现了错误,注意红色的peojectname必须相同,但大小写不需要一致,
这个最后保存在www\config.xml里。如果这里不一致,则会出现不能生成build.xml的错误。


adb命令行下检查输出的错误log.

adb logcat Cordova:D DroidGap:D CordovaLog:D *:S
adb logcat CordovaLog:D *:S"

星期五, 八月 02, 2013

phonegap一些稀奇古怪的错误

npm 安装包到指定目录语法:

npm --prefix 路径即可

cordova -d platform add android安装出现如下错误的时候


Error: No platforms added to this project. Please use `cordova platform add <platform>`.

加上详细输出 -d 来看具体的错误,这个错误是由于
JAVA_HOME需要设置以及 path中加入可以找到 javac的路径即可。

如何使用不同的phonegap Adobe ID build不同的app

删除掉%HOME%\.cordova 目录即可重新提示输入新的用户名和密码了


星期四, 八月 01, 2013

PhoneGap 3.0 编译多平台HTML 5 Client 成功

Android key:

1.keytool -genkey -v -keystore android-release-key.keystore -alias key_android -keyalg RSA -keysize 2048 -validity 10000
2.进入build.phonegap.com 上传Android key。
3.进入目录上传代码:phonegap run android
   可以修改config.xml里面的app名字和修改..cordova 下的config.json相关配置字符串

4.进入build.phonegap.com 查看app,并为Android 选择key,key首先要解锁
5.选择key 文件,重新编译android app并下载

星期五, 七月 19, 2013

如何修改Android Studio 字体

Android Studio 字体默认读取JVM的默认字体。
在Window Xp下非常难看。

通过Android Stuido 菜单File/Setting..../搜索 font,建立自己的Scheme,确定保存即可

星期三, 七月 17, 2013

Gradle gui

gradle --gui 弹出GUI窗口。

星期五, 七月 05, 2013

Android Studio gradle plugin 帮助手册

Android Tools Project Site


这里比较全的包含了gradle task.

如何在build.gradle在最后打包的apk里加入JNI的库

如何生成jni库,不赘述,需要修改build.gradle加入如下语句即可:
 不过注意此脚本适合:'com.android.tools.build:gradle:0.4版本,其后的版本可能默认加入JNI打包的步骤:

tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->pkgTask.jniDir new File(buildDir, 'native-libs')

task copyNativeLibs(type: Copy) {
    println 'call copyNativeLibs'
    from fileTree(dir: 'libs', include: '**/*.so' )
    into 'build/native-libs'
}

build.gradle加入自己的签名文件。

如何生成签名文件不赘述。
build.gradle 加入如下语句即可:
android {
    compileSdkVersion 10
    buildToolsVersion "17.0.0"

    signingConfigs  {
        debug{
        storeFile = file("D:\\eclipse workspace\\dbball-cn\\dbball-cn\\release.keystore")
        keyAlias = "sunose"
        storePassword = "sunose"
        keyPassword = "sunose"
        }
        release{
            storeFile = file("D:\\eclipse workspace\\dbball-cn\\dbball-cn\\release.keystore")
            keyAlias = "sunose"
            storePassword = "sunose"
            keyPassword = "sunose"
        }
    }

注意如何发布运行测试的时候出现:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
错误,是由于以前的版本已经安装使用了不同签名,只要删除掉该app
从新发布即可。

Java Double Brace Initialization

常用语Java Collect类的初始化,因为Java没有提供简易的初始化Collect的方法。
Set<String> flavors = new HashSet<String>() {{      add("vanilla");      add("strawberry");      add("chocolate");      add("butter pecan");  }};

The first brace creates a new AnonymousInnerClass,
the second declares an instance initializer block that is run when the anonymous inner class is instantiated.

 add(new JPanel() {{  	setLayout(...);  	setBorder(...);  	add(new JLabel(...));  	add(new JSpinner(...));   }});

星期四, 七月 04, 2013

Android Studio操作说明:INSTALL_PARSE_FAILED_NO_CERTIFICATES

有两个生成最终app的模式:一个是testing/debuggging debug模式,
另外一个是release 模式,rease模式必须要自己签名。debug模式则声称
一个debug.store的签名用于调试。

生成自己的签名app在菜单build/generate signed APK....就可以了。

星期三, 七月 03, 2013

如何得到当前使用的Grovvy的版本。

2.0之后可以用如下方法:
println groovy.lang.GroovySystem.getVersion()

星期六, 六月 29, 2013

如何更新Android studio to 0.1.8

Help 菜单 Check for update...
在中国大陆 dl-sdk.appspot.com 这个地址被封闭了。
所以要不修改hosts或者使用VPN来更新