2010年3月15日月曜日

[SWT] SWT on 64bit Mac OS X

Mac OS X 10.6.2 Snow Leopardで
SWTアプリケーションがちゃんと動かない現象があって色々調べてみたら
どうやらオプションが必要のようだ。

「-d64」オプションと「-XstartOnFirstThread」オプション

「-d64」オプションは明確に64bit VMを指定するために使う。

「-XstartOnFirstThread」オプションはMacでSWTアプリケーションが正常に動けるため必要のようだ。SWTに限ったオプションではないらしい。

二つのオプションを付けると。。
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar

実際テストしてみると問題なく動作した。

参照してサイト
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php

[SWT] SWT on 64bit Mac OS X

Mac OS X 10.6.2 Snow Leopard위에
SWT어플리케이션을 실행시키면 뭔가 제대로 실행이 안되는 현상이 있다.
그래서 이것저것 찾아보니 몇가지 옵션이 필요한 듯 하다.

「-d64」옵션과 「-XstartOnFirstThread」옵션

「-d64」옵션 : 명확하게 64bit VM에서 동작하도록 지정해준다.

「-XstartOnFirstThread」옵션 : Mac에서 SWT어플리케이션이 정상적으로 동작하는데 필요한 옵션인 듯 하다. SWT에 한정된 옵션은 아닌 듯.

두 옵션을 실제 사용해 보면
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar

실제 테스트에서 문제없이 작동하였다.

참고한 사이트.
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php

2010年3月11日木曜日

[Android] 「Android NDK r3」を使ってみた。

今回リリースされた「Android NDK r3」を使ってみた。

環境:Mac OS X 10.6.2

android-ndk-r3-darwin-x86.zipを「http://developer.android.com/」からダウンロードして適当に展開する。
おれは「/Users/babukuma/dev/android-ndk-r3」にした。(以下$NDK)

1. Androidプロジェクト生成
テスト用のプロジェクトを生成する。

生成するとこの構成になるはず。

「jni」フォルダ作成


2.「Application.mk」ファイル作成。
プロジェクトディレクトリ下に「Application.mk」ファイルを作成。

今回はモジュール名を「jnitest」にした。
書き方は「$NDK/docs/APPLICATION-MK.TXT」参照

# Application.mk
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := jnitest


3. Nativeメソッド作成。
「Main.java」ファイルに作成した。

package com.babukuma.android.test.jni;

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

public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public native String helloJNI();

public native int add(int a, int b);
}


4. ヘッダファイル生成
プロジェクトディレクトリで「javah」コマンドでヘッダファイル「jni/jnitest.h」を生成。

生成された「jnitest.h」ファイル

/* DO NOT EDIT THIS FILE - it is machine generated */
#include<jni.h>
/* Header for class com_babukuma_android_test_jni_Main */

#ifndef _Included_com_babukuma_android_test_jni_Main
#define _Included_com_babukuma_android_test_jni_Main
#ifdef __cplusplus
extern"C" {
#endif
/*
* Class: com_babukuma_android_test_jni_Main
* Method: helloJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_babukuma_android_test_jni_Main_helloJNI
(JNIEnv *, jobject);

/*
* Class: com_babukuma_android_test_jni_Main
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_babukuma_android_test_jni_Main_add
(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif


5. Cソース作成。
「jni」ディレクトリで「jnitest.c」を作成する。

作った「jnitest.c」ファイル

#include<jni.h>
#include"jnitest.h"

JNIEXPORT jstring JNICALL Java_com_babukuma_android_test_jni_Main_helloJNI(
JNIEnv *env, jobject thisObj) {
jstring result = (*env)->NewStringUTF(env, "Hello JNI !");
return result;
}

JNIEXPORT jint JNICALL Java_com_babukuma_android_test_jni_Main_add(JNIEnv *env,
jobject thisObj, jint a, jint b) {
jint result = a + b;
return result;
}


6. 「Android.mk」ファイルを作成する。
jniディレクトリに「Android.mk」ファイルを作成する。
書き方は「$NDK/docs/ANDROID-MK.TXT」参照

作った「Android.mk」ファイル

# Android.mkLOCAL_PATH := $(call my-dir)

include$(CLEAR_VARS)

LOCAL_MODULE := jnitest
LOCAL_SRC_FILES := jnitest.c

include$(BUILD_SHARED_LIBRARY)


7. Cソースビルド
ビルドをするにはプロジェクトPATHが「$NDK/apps/<プロジェクト>」になる必要があるのでリンクを作った。

$NDKディレクトリで「make APP=jnitest」でビルド
ここで「jnitest」は「$NDK/apps/」下のプロジェクトフォルダ名になる。

Eclipseをリロードしてみると「libs/armeabi/libjnitest.so」ファイルが生成されたのがわかる。


8. Javaソースを修正して実行してみる。
修正後の「Main.java」ファイル

package com.babukuma.android.test.jni;

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

public class Main extends Activity {
static {
System.loadLibrary("jnitest");
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// call helloJNI()
TextView result1 = (TextView) findViewById(R.id.text_result_1);
result1.setText(helloJNI());

// call add(1, 2)
TextView result2 = (TextView) findViewById(R.id.text_result_2);
result2.setText("1 + 2 = " + add(1, 2));
}

public native String helloJNI();

public native int add(int a, int b);
}


修正後実行してみるとNativeメソッドが問題なく呼ばれた。

2010年3月10日水曜日

[Android] Android NDK r3를 사용해보다.

이번에 새로 릴리즈된 Android NDK r3를 사용해보았다.

OS는 Mac OS X 10.6.2

android-ndk-r3-darwin-x86.zip파일을 「http://developer.android.com/」사이트에서 다운로드하고 적당한 곳에 압축을 풀어놨다.
나는 「/Users/babukuma/dev/android-ndk-r3」이 경로에 풀어놨다.(이하 $NDK)

1. Android프로젝트 생성.
테스트용으로 프로젝트를 생성.

생성되면 프로젝트는 아마도 이런 구조.

여기서 「jni」폴더를 생성.


2. 「Application.mk」파일을 작성.
프로젝트 밑에 「Application.mk」파일을 작성한다.

여기서는 모듈명을 「jnitest」로 하였다.
작성법은 「$NDK/docs/APPLICATION-MK.TXT」파일을 참조.

# Application.mk
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := jnitest


3. Native메소드를 작성
「Main.java」파일에 작성하였다.

package com.babukuma.android.test.jni;

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

public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public native String helloJNI();

public native int add(int a, int b);
}


4. 헤더파일 생성.
프로젝트 디렉토리에서 「javah」를 커맨드로 헤더파일「jni/jnitest.h」을 생성.

생성된 「jnitest.h」파일

/* DO NOT EDIT THIS FILE - it is machine generated */
#include<jni.h>
/* Header for class com_babukuma_android_test_jni_Main */

#ifndef _Included_com_babukuma_android_test_jni_Main
#define _Included_com_babukuma_android_test_jni_Main
#ifdef __cplusplus
extern"C" {
#endif
/*
* Class: com_babukuma_android_test_jni_Main
* Method: helloJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_babukuma_android_test_jni_Main_helloJNI
(JNIEnv *, jobject);

/*
* Class: com_babukuma_android_test_jni_Main
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_babukuma_android_test_jni_Main_add
(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif


5. C소스 작성
「jni」디렉토리에 「jnitest.c」파일을 작성한다.

작성한 「jnitest.c」파일

#include<jni.h>
#include"jnitest.h"

JNIEXPORT jstring JNICALL Java_com_babukuma_android_test_jni_Main_helloJNI(
JNIEnv *env, jobject thisObj) {
jstring result = (*env)->NewStringUTF(env, "Hello JNI !");
return result;
}

JNIEXPORT jint JNICALL Java_com_babukuma_android_test_jni_Main_add(JNIEnv *env,
jobject thisObj, jint a, jint b) {
jint result = a + b;
return result;
}


6. 「Android.mk」파일을 작성.
「jni」디렉토리에 「Android.mk」파일을 작성한다.
작성법은 「$NDK/docs/ANDROID-MK.TXT」을 참조.

작성한「Android.mk」파일

# Android.mkLOCAL_PATH := $(call my-dir)

include$(CLEAR_VARS)

LOCAL_MODULE := jnitest
LOCAL_SRC_FILES := jnitest.c

include$(BUILD_SHARED_LIBRARY)


7. C소스 빌드
빌드를 하기위해서는 프로젝트의 PATH가 「$NDK/apps/<프로젝트명>」여야할 필요가 있으므로 링크를 작성하였다.

$NDK디렉토리에서 「make APP=jnitest」로 빌드.
여기서 「jnitest」는 「$NDK/apps/」밑의 프로젝트폴더명이 된다.

Eclipse를 새로고침하면 「libs/armeabi/libjnitest.so」파일이 생성되어있는 것을 알 수 있다.


8. Java소스를 수정하여 실행해봄.
수정후의 「Main.java」파일

package com.babukuma.android.test.jni;

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

public class Main extends Activity {
static {
System.loadLibrary("jnitest");
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// call helloJNI()
TextView result1 = (TextView) findViewById(R.id.text_result_1);
result1.setText(helloJNI());

// call add(1, 2)
TextView result2 = (TextView) findViewById(R.id.text_result_2);
result2.setText("1 + 2 = " + add(1, 2));
}

public native String helloJNI();

public native int add(int a, int b);
}


수정후 실행해보면 Native메소드가 문제없이 호출된 것을 알 수 있다.