ARGENTO CUORE

 May the code be with you.

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.05.16[日] CとScalaとJNIと

メモ。
typedef struct SDL_Surface {
Uint32 flags; /* Read-only */
SDL_PixelFormat *format; /* Read-only */
int w, h; /* Read-only */
Uint16 pitch; /* Read-only */
void *pixels; /* Read-write */
SDL_Rect clip_rect; /* Read-only */
int refcount; /* Read-mostly */

/* This structure also contains private fields not shown here */
} SDL_Surface;


という構造体があったとき、これをScala側で扱うため、Scala側でクラスを作る。

class SDL_Surface {
flags:Int = 0
format:SDL_PixelFormat = null
w:Int = 0
h:Int = 0
pitch:Int = 0
pixels:Int = 0
clip_rect:SDL_Rect = null
refcount:Int = 0
}


Uint32はLongにしたほうが良いのかな。
でも値として使う直前に最上位ビットを使用しているかどうかを判別して意味のある値に変換してやれば問題ない?

javahを使ってheaderを作り、コードを書く。
以下のコードは、確認のために、flagsというメンバ変数に100という値を入れている。

  jclass surface = (*env)->FindClass(env, "SDL_Surface");
jmethodID cns = (*env)->GetMethodID(env,surface, "", "()V");
jfieldID fj = (*env)->GetFieldID(env, surface, "flags", "I");
jobject surface_obj = (*env)->NewObject(env, surface, cns);
jint rj = (jint)100;

(*env)->SetIntField(env, surface_obj, fj, rj);


手順
1.FindClassでScala側のクラスを取得し、jclass構造体変数を作成する。
2.GetMethodIDで、init、()Vを第3、第4引数に指定することで、コンストラクタメソッドを取得。
3.GetFieldIDで、クラスのflagsメンバ変数を取得。flagsはInt型なので、Iという文字を第4引数に与える。
4.NewObjectに、クラスとコンストラクタを与えて実体化。
5.SetIntFieldで、オブジェクトの、GetFieldIDで取得してきたメンバ変数と、そこにセットする値を指定する。

参考
http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html

- 追記 -
オブジェクトをフィールドにセットするときは、"Lクラスの完全パッケージ名;"を型のところに記述する。
スポンサーサイト

Comment






(編集・削除用)


管理者にだけ表示を許可

Trackback

http://ronor.blog81.fc2.com/tb.php/88-9a1980bf

この記事にトラックバック(FC2Blog User)

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。