⌃ + ⌘ + [↑|↓]
Ctrl + Cmd + [up|down]
2014年1月21日火曜日
Xcode5で.hファイルと.mファイルの切り替え
Xcode5 で ヘッダファイルとモジュールファイルを切り替えるショートカット
2014年1月9日木曜日
JNIサンプル集
順次追加していきます
メソッドシグネチャ
型一覧| void | V |
| boolean | Z |
| byte | B |
| char | C |
| short | S |
| int | I |
| long | J |
| double | D |
| float | F |
| String | Ljava/lang/String; |
| Object | Ljava/lang/Object; |
| その他のクラス | "L"+"完全修飾クラス名(スラッシュ区切り)"+";" |
[をつけると配列を表す
| boolean array | [Z |
| byte array | [B |
| char array | [C |
| short array | [S |
| int array | [I |
| long array | [J |
| double array | [D |
| float array | [F |
| String array | [Ljava/lang/String; |
| Object array | [Ljava/lang/Object; |
メソッドシグネチャは
(引数)戻り値
の形で表す。
引数が複数ある場合は連続して記述する。
引数が無い場合は括弧の中に何も書かない。
メソッドシグネチャの実例
| void hoge(); | "()V" |
| void hoge(int a); | "(I)V" |
| int hoge(int a) | "(I)I" |
| int hoge(int a, int b) | "(II)I" |
| long hoge(short a, double b) | "(SD)J" |
| boolean hoge(String a); | "(Ljava/lang/String;)Z" |
| boolean hoge(int a[], char b, byte c[] ) | "([ab[c)Z" |
java メンバーメソッドの呼び出し
例:その関数を呼び出したjavaオブジェクトのメンバーメソッドhogeを呼び出す関数
上がvoid hoge();
下がint hoge(int a, int b );
JNIEXPORT void JNICALL naHoge( JNIEnv* env, jobject obj){
jclass clsj = env->GetObjectClass(obj);
jmethodID func = env->GetMethodID(clsj, "hoge", "()V");
env->CallVoidMethod(obj, func);
}
JNIEXPORT void JNICALL naHoge( JNIEnv* env, jobject obj){
jclass clsj = env->GetObjectClass(obj);
jmethodID func = env->GetMethodID(clsj, "hoge", "(II)I");
int retval = env->CallIntMethod(obj, func, 1, 2 );
}
C側からjavaメンバー変数の値取得
例:その関数を呼び出したjavaオブジェクトのメンバー変数mHogeValueの値(int)を取得する関数
JNIEXPORT void JNICALL naHoge( JNIEnv* env, jobject obj){
jclass clsj = env->GetObjectClass(obj);
jfieldID fid =
env->GetFieldID(clsj, "mHogeValue" , "I");
int hogeValue = env->GetIntField(obj, fid );
}
C側からjava メンバー変数の値変更
例:その関数を呼び出したjavaオブジェクトのメンバー変数mHogeValueの値(int)に1を設定する関数
JNIEXPORT void JNICALL naHoge( JNIEnv* env, jobject obj){
jclass clsj = env->GetObjectClass(obj);
jfieldID fid =
env->GetFieldID(clsj,"mHogeValue" , "I");
env->SetIntField(obj, fid, 1);
}
C側からjava側にint配列を返す
JNIEXPORT void JNICALL naHoge( JNIEnv* env, jobject obj){
int valuesToTransfer[3] = {1,2,3};
int len = sizeof(valuesToTransfer) / sizeof(int);
jintArray array = env->NewIntArray(len);
if (array == NULL) {
return NULL;
}
env->SetIntArrayRegion(array, 0, len , valuesToTransfer );
return;
}
C側で文字列を受け取る
JNIEXPORT void JNICALL setString(JNIEnv* env, jobject obj,
jstring javaStringObj )
{
const char * cstring = env->GetStringUTFChars(javaStringObj, 0);
}
C側で文字列の配列を受け取る
JNIEXPORT void JNICALL setStringArray(JNIEnv* env, jobject obj, jobjectArray javaStringArray)
{
int stringCount = env->GetArrayLength(javaStringArray);
for (int i=0; i<stringCount; i++) {
jstring string = (jstring) env->GetObjectArrayElement( javaStringArray, i);
const char *rawString = env->GetStringUTFChars( string, 0);
// Don't forget to call `ReleaseStringUTFChars` when you're done.
// ....
env->ReleaseStringUTFChars( string, rawString );
}
}
初期化(JNI_OnLoad)やその時すべき処理等のサンプル
https://android.googlesource.com/platform/development/+/master/samples/SimpleJNI/jni/native.cpp
登録:
コメント (Atom)