2011/03/17

[Eclipse]效能改善

reference:暗夜-解決eclipse效能不好...

開啟eclipse\eclipse.ini後

修改這兩行的數字變成256跟512
-Xms256m
-Xmx512m
新增這三行在檔案最後面
-XX:PermSize=265M
-XX:MaxPermSize=265M
-XX:+UseParalle1GC

編輯完成後存檔離開~
先開啟工作管理員準備監看eclipse.exe會吃多少資源,然後開啟你的eclipse,看有沒有改善吧!

2011/03/16

[Android]Java JNI包SGClient(C dll)

前置作業
(1)安裝Android開發環境(請參考 Android BMI)
(2)安裝JNI開發環境(請參考 智慧生活科技專業社群)

進入正題

1.將SGClient dll的source code改寫為純c語言後,產出libsgclnt.so
a.安裝好android-ndk後,裡面會有一些sample,我們把samples\hello-jni複製一份放在samples底下,並將目錄名稱改為sgclnt
b.將原本由C++開發的SGClient改寫為純C後,將程式碼放在C:\cygwin\android-ndk-r5b\samples\sgclnt\jni目錄底下
c.sgclnt\jni底下有個hello-jni.c,rename為SGClntJNI.c,編輯SGClntJNI.c
先include sgclient.h後,把sgclient.h的每個function轉為jni格式的function,
例如:
c:
int SG_Create(int Count);

jni:
jint Java_com_mds_sgclnt_SGClient_SGCreat(JNIEnv* env, jobject thiz, jint Count)
{
    return SG_Create(Count);
}
型態轉換請參考:The Java Native Interface Programmer's Guide and Specification-CH12 JNI Type
命名規則->
SGCreat:Java應用程式呼叫JNI介面提供的function name
SGClient:第二步驟時會建立Java的Class,Class name為SGClient,透過這個Class來呼叫JNI介面提供的Function
com_mds_sgclnt:SGClient這個class會被包在com.mds.sgclnt這個package裡面
Java:固定
jint:int型態在jni中的轉型

d.在相同目錄下,建立Android.mk這個MAKEFILE,makefile內容如下
#-----Android.mk-----
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=sgclnt
#註:JAVA在System.loadLibrary("sgclnt")時會用到的dll名稱
LOCAL_SRC_FILES:=SGClntJNI.c
LOCAL_SRC_FILES+=SGClnt.c
LOCAL_SRC_FILES+=file1.c
LOCAL_SRC_FILES+=file2.c
LOCAL_SRC_FILES+=file3.c
#註:把剛剛放在JNI目錄內的.c檔都用+=的方式包進來
include $(BUILD_SHARED_LIBRARY)
#-----Android.mk-----
編輯完後存檔。

e.開啟cygwin,並切換到samples\sgclnt目錄,執行ndk-build,便會在sample\sgclnt底下產生libs與obj兩個目錄,
其中libs\armeabi\libsgclnt.so即為dll檔

2.建立Java端SGClient package
f.建立C:\cygwin\android-ndk-r5b\samples\sgclnt\src\com\mds\sgclnt\SGClient.java
這邊的com\mds\sgclnt與SGClient.java會呼應到SGClntJNI.c中的function命名規則,剛剛我們是用hello-jni copy過來的,所以只要把不同的目錄or檔案rename即可。

g.用Java寫一個package,package名稱與剛剛開啟的路徑有關,這邊的package名稱就叫做com.mds.sgclnt,
並將SGClient元件(C)預定要產出的介面也宣告在SGClient class(JAVA)中,並在宣告前加上public static native。
SGClient.java內容:

package com.mds.sgclnt;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class SGClient extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        //TextView  tv = new TextView(this);
        //tv.setText( stringFromJNI() );
        //setContentView(tv);
      
        int nRet = 0;
nRet = SGCreate();//調用C Function,並觀測返回值是否正確!
    }

    static {
        System.loadLibrary("sgclnt");
    }
    public static native int SGCreate();
    public static native int SGDestory();
    .
    .
    .
}

3.測試
h.修改專案資訊
開啟samples\sgclnt\AndroidManifest.xml
manifest tag內有package參數,修改package="com.mds.sgclnt"
因為有用到網路,目前是在Android Virtual Device內運行,所以要增加<uses-permission android:name="android.permission.INTERNET"/>這行放在uses-sdk這個tag結束之後,
activity tag要修改android::name=".SGClient"
存檔後結束編輯

i.開啟專案並建立Builder
這邊跟智慧生活科技專業社群裡面介紹的步驟都一樣,唯一差別是Main標籤中的Arguments要輸入:--login -c "cd $NDK_Sample/sgclnt && ndk-build"

祝好運~