2013년 8월 26일 월요일

Unzip in Java

    private ProgressDialog mProgressDialog;
    private String unzipLocation = Environment.getExternalStorageDirectory() + "/";
    private String zipFile = Environment.getExternalStorageDirectory() + "/xxx.zip";



                unzip();


        public void unzip() throws IOException {
            mProgressDialog = new ProgressDialog(MainActivity.this);
            mProgressDialog.setMessage("Please Wait...Extracting zip file ... ");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
            new UnZipTask().execute(zipFile, unzipLocation);
        }
     
        private class UnZipTask extends AsyncTask<String, Void, Boolean> {
            @SuppressWarnings("rawtypes")
            @Override
            protected Boolean doInBackground(String... params) {
                String filePath = params[0];
                String destinationPath = params[1];
                File archive = new File(filePath);
                try {
                    ZipFile zipfile = new ZipFile(archive);
                    for (Enumeration e = zipfile.entries(); e.hasMoreElements();) {
                        ZipEntry entry = (ZipEntry) e.nextElement();
                        unzipEntry(zipfile, entry, destinationPath);
                    }
                    UnZipUtil d = new UnZipUtil();
                    d.unZip(zipFile, unzipLocation);

                    } catch (Exception e) {

                    return false;
                }
                return true;
            }

            @Override
            protected void onPostExecute(Boolean result) {
                mProgressDialog.dismiss();
            }

            private void unzipEntry(ZipFile zipfile, ZipEntry entry, String outputDir) throws IOException {
                if (entry.isDirectory()) {
                    createDir(new File(outputDir, entry.getName()));
                    return;
                }

                File outputFile = new File(outputDir, entry.getName());
                    if (!outputFile.getParentFile().exists()) {
                    createDir(outputFile.getParentFile());
                }

                // Log.v("", "Extracting: " + entry);
                BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
                BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));
                try {

                } finally {

                    outputStream.flush();
                    outputStream.close();
                    inputStream.close();
                }
            }

            private void createDir(File dir) {
                if (dir.exists()) {
                    return;
                }

                if (!dir.mkdirs()) {
                    throw new RuntimeException("Can not create dir " + dir);
                    }
            }
        }

        public class UnZipUtil {
            public boolean unZip(String zipFile, String ToPath) {
                InputStream is;
                ZipInputStream zis;
                try {
                    String filename;
                    is = new FileInputStream(zipFile);
                    zis = new ZipInputStream(new BufferedInputStream(is));        
                    ZipEntry ze;
                    byte[] buffer = new byte[1024];
                    int count;

                    while ((ze = zis.getNextEntry()) != null) {
                        // zapis do souboru
                        filename = ze.getName();

                        // Need to create directories if not exists, or
                        // it will generate an Exception...
                        if (ze.isDirectory()) {
                           File fmd = new File(ToPath + filename);
                           fmd.mkdirs();
                           continue;
                        }

                        FileOutputStream fout = new FileOutputStream(ToPath + filename);

                        // cteni zipu a zapis
                        while ((count = zis.read(buffer)) != -1) {
                            fout.write(buffer, 0, count);          
                        }

                        fout.close();            
                        zis.closeEntry();
                    }

                    zis.close();
                } catch(IOException e) {
                    e.printStackTrace();
                    return false;
                }

                return true;
            }
        }
    }

MD5SUM string in Java

    public static String createChecksum(String filename) throws Exception {
        InputStream fis =  new FileInputStream(filename);

        byte[] buffer = new byte[1024];
        MessageDigest complete = MessageDigest.getInstance("MD5");
        int numRead;

        do {
            numRead = fis.read(buffer);
            if (numRead > 0) {
                complete.update(buffer, 0, numRead);
            }
        } while (numRead != -1);

        fis.close();
        byte[] digest = complete.digest();
        StringBuffer sb = new StringBuffer();
        for (byte b : digest) {
            if ((int)(b & 0xff) <= 0xf)
                sb.append(Integer.toHexString(0));
            sb.append(Integer.toHexString((int) (b & 0xff)));
        }
 
        return sb.toString();
    }

2013년 8월 12일 월요일

cheapcast on ODROID

chromecast 없이 android 디바이스로 chromecast emulator 해주는 재밌는 어플이 나왔네요.
ODROID에 올려서 사용하면 딱 일 것 같아 시도 해 봤는데 연결이 원할하지 못 하네요.

https://plus.google.com/u/0/107130354111162483072/posts/bc1TZChjhRE

아래 이미지는 Galaxy Nexus에서 ODROID-XU로 Chomecast를 시도한 모습니다.





ODROID-XU의 화면



https://play.google.com/store/apps/developer?id=Sebastian+Mauer

2013년 8월 5일 월요일

ODROID-XU와 big.LITTLE

오드로이드 포럼에 Exynos5410의 big.LITTLE의 문제에 대해서 글이 하나 있습니다.
http://forum.odroid.com/viewtopic.php?f=65&t=1884

Exynos5410의 CCI-400 버그로 big.LITTLE의 클러스트 마이그레이션밖에 동작하지 않습니다. 그래서 이번에 수정되어 나온 Exynos5420과 비교하며 많은 개발자들이 아쉬워하고 있습니다.

IKS(In-Kernel Switcher)가 동작하는 CPU 마이그레이션과 클러스터 마이그레이션은 차이는 DVFS에 의해 특정 clock으로 올라가면 전체가 A15로 동작하지만 Core별로 A7과 A15를 선택적으로 동작 시킬 수 있다는 것입니다. 따라서 클러스커 마이그레이션과 달리 4개의 core가 다 A15로 동작할 필요가 없기 때문에 전력 효율이 높다는 장점이 있습니다. 하지만 big.LITTLE 설명한 것 처럼 저전력과 관련된 설계이고 오드로이드와 같이 A/C 전원이 항상들어가는 시스템에서는 아무런 의미가 없습니다.
Exynos5250은 A15 dual-core이고 Exynos5410은 A15 quad-core라 생각하시면 간단 할 것 같습니다.

물론 Exynos5420이 더 높은 clock과 GPU 성능이 높습니다. 하지막 아직 상용 제품에 출시 되지 않았습니다. 개발 보드로 나오기 위해서는 더 많은 시간이 필요할 것입니다.




big.LITTLE의 최후 목표인 MP모드는 커널의 scheduler의 재설계의 문제 이기 때문에 CCI의 버그와는 무관한 것으로 이해하고 있습니다. 아직 MP모드로의 실제 동작은 먼 얘기로 알고 있습니다.

Apple에서도 다음 CPU에 big.LITTLE을 사용하다고 합니다. Apple이야 자체 커널이 있으니 잘 해결하겠죠??? Apple의 big.LITTLE의 행보가 기대 됩니다.

참고한 사이트 입니다.
http://gamma0burst.tistory.com/m/613

bluez on ODROID-XU(Android-4.2.2)





ODROID-XU에  USB Bluetooth 가 동작합니다.

아래 소스를 기반으로 merge 하였습니다.

http://gitorious.org/android-bluez

git에서 안 받아 지시면 아래 patch를 적용해 보세요.

https://drive.google.com/file/d/0B5aZmgmqP9rORG1ZbWFIMG9wYU0/edit?usp=sharing

2013년 8월 2일 금요일

Android Multi User on ODROID-XU

ODROID-XU

The world’s first big.LITTLE architecture based bare-board computer. 
• Exynos5 Octa Cortex™-A15 1.6Ghz quad core and Cortex™-A7 quad core CPUs
• PowerVR SGX544MP3 GPU (OpenGL ES 2.0, OpenGL ES 1.1 and OpenCL 1.1 EP)
• 2Gbyte LPDDR3 RAM PoP
• USB 3.0 Host x 1, USB 3.0 OTG x 1, USB 2.0 Host x 4
• HDMI 1.4a output Type-D connector
• eMMC 4.5 Flash Storage

Android 4.2.2

device/hardkernel/odroidxu/overlay/frameworks/base/core/res/res/values/config.xml
    <!--  Maximum number of supported users -->
    <integer name="config_multiuserMaximumUsers">3</integer>











2013년 7월 31일 수요일

JNI int,String array parameter, return value

int array를 parameter로 넘겨기 예제(java->jni)

---------------------------------------------------------------------------------------
java file

public class Test {
    static {
        System.loadLibrary("test");
    }

    public static void func1(int arr[]) {
        native_func1(core);
    }

 private native static void native_func1(int arr[]);


---------------------------------------------------------------------------------------
cpp file

static void native_func1(JNIEnv* env, jobject obj, jintArray arr) {
    int size = env->GetArrayLength(arr);

    jint *value = env->GetIntArrayElements(arr, NULL);

    for (int i = 0; i < size; i++) {
        value[i] = i;
    }
 
    env->ReleaseIntArrayElements(arr, value, 0);
    return;
}

static const JNINativeMethod g_methods[] = { 
    { "native_func1", "([I)V", (void*)native_func1 }, 
}; 
  
---------------------------------------------------------------------------------------
//배열 생성 
int[] arr = new int[4];
//배열 전달
Test.func1(arr);


String array를 return value로 받기(jni->java)

---------------------------------------------------------------------------------------
java file
static jobjectArray native_func2(JNIEnv* env, jobject obj) {
    char *temp[4] = { "apple, "banana", tomato", "melon"};

    jobjectArray ret = (jobjectArray)env->NewObjectArray(4, env->FindClass("java/lang/String"),
            env->NewStringUTF(""));

    for (int i = 0; i < 4; i++) {
        env->SetObjectArrayElement(ret, i, env->NewStringUTF(temp[i]));
    }
    return ret;
}

static const JNINativeMethod g_methods[] = {
    { "native_func2", "()[Ljava/lang/String;", (jobjectArray*)native_func2 },
};


---------------------------------------------------------------------------------------
java file

public class Test {
    static {
        System.loadLibrary("test");
    }

    public static String[] func2() {
        return native_func2();
    }

    private native static String[] native_func2();



---------------------------------------------------------------------------------------
String[] str = new String[4];
str = Test.func2();