http://www.full-so.com/notebook/jni.html
JAVA側のソース(code.java)
public class code {
static{ // ネイティブライブラリをロードします
System.loadLibrary("code");
}
/*引数でC側へ値を渡す場合*/
private native long test(String str1,String str2);
public String p_str;
public long p_long;
public double p_dbl;
public static void main(String[] args) {
HelloWorldJNI obj_code = new code();
// メソッドを実行
obj_code.test("text1","text2");
}
C側のソース
#include
#include
//共通関数
BSTR Multi2Wide (const char *);
BSTR jstring2BSTR (JNIEnv *, jstring );
BSTR Get_jstringFld2BSTR (JNIEnv *,jobject ,jclass, const char *);
long Get_jlongFld2long (JNIEnv *,jobject ,jclass ,const char *);
double Get_jdoubleFld2double (JNIEnv *,jobject ,jclass ,const char *);
void Set_BSTR2jstringFld (JNIEnv *,jobject ,jclass ,const char *,BSTR );
void Set_LPSTR2jstringFld (JNIEnv *,jobject ,jclass ,const char *,LPSTR );
void Set_long2jlongFld (JNIEnv *,jobject ,jclass ,const char *,long );
void Set_double2jdoubleFld (JNIEnv *,jobject ,jclass ,const char *,double );
JNIEXPORT jlong JNICALL Java_code_test
(JNIEnv *env,jobject mythis,jstring str1,jstring str2){
BSTR bstr;
long lngbuf;
double dblbuf;
//引数の値を取得
bstr = jstring2BSTR(env,str1); //BSTRに変換
//ここで使用
SysFreeString(bstr);//BSTRの開放
//java側の実体を取得
jclass clazz = env->GetObjectClass(mythis);
//java側のコードを直接get、set
bstr = Get_jstringFld2BSTR(env,mythis,clazz,"p_str");
//p_strをここで使用
Set_BSTR2jstringFld(env,mythis,clazz,"p_str",bstr);
SysFreeString(bstr);//BSTRの開放
Get_jlongFld2long(env,mythis,clazz,"p_lng")
//p_lngをここで使用
Set_long2jlongFld(env,mythis,clazz,"p_lng",lngbuf);
Get_jdoubleFld2double(env,mythis,clazz,"p_dbl")
//p_dblをここで使用
Set_double2jdoubleFld(env,mythis,clazz,"p_dbl",dblbuf);
//オブジェクトの解放
env->DeleteLocalRef(clazz);
return 0;
}
/******************************************************************
* SJIS(Char)からUNIコード(BSTR)への変換。
* for All
* SJISからUNIコードへ変換する。
* // 使用後は戻り値を SysFreeString()すること
* @return UNIコード文字列。
******************************************************************/
BSTR Multi2Wide(const char *str){
int intWLen = MultiByteToWideChar(CP_ACP, 0 , str, strlen(str), NULL, 0);
BSTR pVal = SysAllocStringLen(NULL, intWLen);
MultiByteToWideChar(CP_ACP, 0 /*MB_PRECOMPOSED*/, str, strlen(str), pVal, intWLen);
return pVal;
}
/******************************************************************
* JstringをUNIコード(BSTR)へ変換して返す。
* for All
* // 使用後は戻り値を SysFreeString()すること
* @return UNIコード文字列。
******************************************************************/
BSTR jstring2BSTR(JNIEnv *env, jstring jstr)
{
const jchar* jc = env->GetStringChars(jstr, NULL);
int len = env->GetStringLength(jstr);
BSTR bstr = SysAllocStringLen(jc, len);
env->ReleaseStringChars(jstr, jc);
return bstr;
}
/******************************************************************
* JAVA側から指定されたフィールド値を取得し、JstringをUNIコード(BSTR)へ変換して返す。
* for All
* // 使用後は戻り値を SysFreeString()すること
* @return UNIコード文字列。
******************************************************************/
BSTR Get_jstringFld2BSTR(JNIEnv *env,jobject mythis,jclass clazz,const char *FieldName)
{
//オブジェクトのクラスを取得
jfieldID fid = env->GetFieldID(clazz, FieldName, "Ljava/lang/String;"); //指定のフィールドIDの取得
jstring jstr = (jstring)env->GetObjectField(mythis, fid); //javaフィールドからjstring取得
const jchar* jc = env->GetStringChars(jstr, NULL); //jstring -> jchar
int len = env->GetStringLength(jstr); //jstrのサイズ
BSTR bstr = SysAllocStringLen(jc, len); //jstring -> BSTR
env->ReleaseStringChars(jstr, jc); //jc の解放
env->DeleteLocalRef(jstr); //jstr の解放
jstr = NULL;
jc = NULL;
return bstr;
}
/******************************************************************
* JAVA側から指定されたフィールド値を取得し、Jlongをlongへ変換して返す。
* for All
* @return long
******************************************************************/
long Get_jlongFld2long(JNIEnv *env,jobject mythis,jclass clazz,const char *FieldName)
{
jfieldID fid = env->GetFieldID(clazz, FieldName, "J");
return (long)env->GetLongField(mythis, fid);
}
/******************************************************************
* JAVA側から指定されたフィールド値を取得し、Jdoubleをdoubleへ変換して返す。
* for All
* @return double
******************************************************************/
double Get_jdoubleFld2double(JNIEnv *env,jobject mythis,jclass clazz,const char *FieldName)
{
jfieldID fid = env->GetFieldID(clazz, FieldName, "D");
return (long)env->GetDoubleField(mythis, fid);
}
/******************************************************************
* 受け渡された値(bstr)を指定されたJAVA側フィールド(FieldName)へ設定します。
* for All
* ※受け渡されたBSTRの解放も行っています。
* @return なし
******************************************************************/
void Set_BSTR2jstringFld(JNIEnv *env,jobject mythis,jclass clazz,const char *FieldName,BSTR bstr)
{
//オブジェクトのクラスを取得
jstring jstrBuf = env->NewString(bstr,SysStringLen(bstr));
jfieldID fid = env->GetFieldID(clazz, FieldName, "Ljava/lang/String;");
env->SetObjectField(mythis, fid,jstrBuf);
env->DeleteLocalRef(jstrBuf);
SysFreeString(bstr);
jstrBuf = NULL;
bstr = NULL;
}
/******************************************************************
* 受け渡された値(bstr)を指定されたJAVA側フィールド(FieldName)へ設定します。
* for All
*
* @return なし
******************************************************************/
void Set_LPSTR2jstringFld(JNIEnv *env,jobject mythis,jclass clazz,const char *FieldName,LPSTR str)
{
jstring jstrBuf = env->NewStringUTF(str);
jfieldID fid = env->GetFieldID(clazz, FieldName, "Ljava/lang/String;");
env->SetObjectField(mythis, fid,jstrBuf);
env->DeleteLocalRef(jstrBuf);
}
/******************************************************************
* 受け渡された値(lngbuf)を指定されたJAVA側フィールド(FieldName)へ設定します。
* for All
* @return なし
******************************************************************/
void Set_long2jlongFld(JNIEnv *env,jobject mythis,jclass clazz,const char *FieldName,long lngbuf)
{
jfieldID fid = env->GetFieldID(clazz, FieldName , "J");
env->SetLongField(mythis, fid,lngbuf);
}
/******************************************************************
* 受け渡された値(dblbuf)を指定されたJAVA側フィールド(FieldName)へ設定します。
* for All
* @return なし
******************************************************************/
void Set_double2jdoubleFld(JNIEnv *env,jobject mythis,jclass clazz,const char *FieldName,double dblbuf)
{
jfieldID fid = env->GetFieldID(clazz, FieldName , "D");
env->SetDoubleField(mythis, fid,dblbuf);
}