文件讀取
stream=fopen("/sdcard/31.jpg","rb");
if(stream)
{
fread(pImageData[0],1,(lHeight*lHeight),stream);
LOGE(" fread pImageData");
}
fclose(stream);
註冊時的方法
Field Descriptor
Java Language Type
Z
boolean
B
byte
C
char
S
short
I
int
J
long
F
float
D
double
對於複雜類型,字符串描述以“L”開頭,以“;”結束,例如java中的String,在jni中的描述爲"Ljava/lang/String;" 注意後面的分號不要少了Object 爲 Ljava/lang/Object;
對於數組,以“[”開頭,接類型描述,例如int[ ],在jni中的描述爲“[I”;String[ ],對應爲“[Ljava/lang/String;”;如果是數組維數增加一維,則"["增加一個,例如int[ ][ ],對應爲“[[I”;
下面是連個例子
java中的方法爲
public native int native_MyJni (String str,String str2,int in,boolean bol);
public native int native_Lomo (String strSrc,String strRes, String srcCfg, int [] intensity, int effect, boolean fisheye_effect, int timeout, int tag);
註冊時
static JNINativeMethod methods[] = {
{"native_Lomo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[IIZII)I",
(void*)Java_com_example_android_simplejni_SimpleJNI_native_1Lomo},
{"native_MyJni","(Ljava/lang/String;Ljava/lang/String;IZ)I",
(void*)Java_com_example_android_simplejni_SimpleJNI_native_1MyJni}
};
函數
Java數組類型
本地類型
GetBooleanArrayElements
jbooleanArray
jboolean
GetByteArrayElements
jbyteArray
jbyte
GetCharArrayElements
jcharArray
jchar
GetShortArrayElements
jshortArray
jshort
GetIntArrayElements
jintArray
jint
GetLongArrayElements
jlongArray
jlong
GetFloatArrayElements
jfloatArray
jfloat
GetDoubleArrayElements
下面寫一下常用類型的轉換
首先是常用的轉換
將就string轉換成 char*
(1) jstring js= env->NewStringUTF("Hello from JNI");
(2) char *str=(char *)env->GetStringUTFChars(js,NULL);
// sprintf(char_result, "%s likes %s.", "who", "you");
// LOGE("js= %s _____++++++ jss=%s ","hello",str);
(3) env->ReleaseStringUTFChars(js,str);
將char * 轉換成 jtring
char* tmpstr = "return string succeeded";
env->SetIntArrayRegion(iArray, 0, 8, arry);
if (obj) {
env->DeleteLocalRef(obj);
}
jbyteArryay to byte *
byte *imgbufferYUV;
jsize len = env->GetArrayLength(attry);
env->GetByteArrayRegion(attry, 0, len, (jbyte *) imgbufferYUV);
jbytearray轉c++byte數組
- jbyte * arrayBody = env->GetByteArrayElements(data,0);
- jsize theArrayLengthJ = env->GetArrayLength(data);
- BYTE * starter = (BYTE*)arrayBody;
jbyteArray 轉 c++中的BYTE[]
- //jbytearray strIn
- jbyte * olddata = (jbyte*)env->GetByteArrayElements(strIn,0);
- jsize oldsize = env->GetArrayLength(strIn);
- BYTE* bytearr = (BYTE*)olddata;
- int len = (int)oldsize;
jbyteArray 轉 char *
char* 轉jstring
- jstring WindowsTojstring(JNIEnv* env, char*str_tmp)
- {
- jstring rtn=0;
- int slen = (int)strlen(str_tmp);
- unsigned short* buffer=0;
- if(slen == 0)
- {
- rtn = env->NewStringUTF(str_tmp);
- }
- else
- {
- int length = MultiByteToWideChar(CP_ACP,0, (LPCSTR)str_tmp, slen, NULL, 0);
- buffer = (unsigned short*)malloc(length*2+1);
- if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer,length) > 0)
- {
- rtn = env->NewString((jchar*)buffer, length);
- }
- }
- if(buffer)
- {
- free(buffer);
- }
- return rtn;
- }
下面這個沒有用過,剛看到,也寫進來,以後如果遇到可以驗證下看。
jstring 轉 char* 或者 const char*
- // jstring str
- const char *key = env->GetStringUTFChars(str, 0);
- //jboolean isOffer
- jsClient->modify(key, isOffer);
- env->ReleaseStringUTFChars(str, key);
JNI 返回 jbyteArray
- JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv*env, jobject obj)
- {
- jbyteArray firstMacArray = env->NewByteArray(6 );
- ......
- jbyte *bytes = env->GetByteArrayElements(firstMacArray, 0);
- for ( inti = 0; i < sizeof( pAdapterInfo->Address); i++ )
- {
- bytes[ i ] = pAdapterInfo->Address[i ];
- }
- env->SetByteArrayRegion(firstMacArray, 0, 6, bytes );
- return firstMacArray;
- }
//jstring to char*
- char* jstringTostring(JNIEnv* env, jstringjstr)
- {
- char* rtn = NULL;
- jclass clsstring = env->FindClass("java/lang/String");
- jstring strencode = env->NewStringUTF("utf-8");
- jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
- jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid, strencode);
- jsize alen = env->GetArrayLength(barr);
- jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
- if (alen > 0)
- {
- rtn = (char*)malloc(alen+ 1);
- memcpy(rtn, ba, alen);
- rtn[alen] = 0;
- }
- env->ReleaseByteArrayElements(barr, ba, 0);
- return rtn;
- }
//char* to jstring
- jstring stoJstring(JNIEnv* env, constchar* pat)
- {
- jclass strClass = env->FindClass("Ljava/lang/String;");
- jmethodID ctorID = env->GetMethodID(strClass, "<init>","([BLjava/lang/String;)V");
- jbyteArray bytes = env->NewByteArray(strlen(pat));
- env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
- jstring encoding = env->NewStringUTF("utf-8");
- return (jstring)env->NewObject(strClass, ctorID,bytes, encoding);
- }
//將jstring類型轉換成windows類型
- char* jstringToWindows( JNIEnv *env, jstring jstr )
- {
- int length = (env)->GetStringLength(jstr);
- const jchar* jcstr = (env)->GetStringChars(jstr,0 );
- char* rtn = (char*)malloc(length*2+1 );
- int size = 0;
- size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr,length, rtn,(length*2+1), NULL, NULL );
- if( size <= 0 )
- return NULL;
- (env)->ReleaseStringChars(jstr, jcstr );
- rtn[size] = 0;
- return rtn;
- }
//將windows類型轉換成jstring類型
- jstring WindowsTojstring( JNIEnv* env, char*str )
- {
- jstring rtn = 0;
- int slen = strlen(str);
- unsigned short * buffer = 0;
- if( slen == 0 )
- rtn = (env)->NewStringUTF(str );
- else
- {
- int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL,0 );
- buffer = (unsigned short *)malloc(length*2 + 1 );
- if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer,length ) >0 )
- rtn = (env)->NewString( (jchar*)buffer, length );
- }
- if( buffer )
- free( buffer );
- return rtn;
- }
jni object的使用
每一個jni格式的dll中的object對應該java裏面的一個類。
如下例有一個 ObjData類,類中有成員bData ,Len
public class ObjData {
public byte[] bData;
public int Len;
}
//------------------------jni獲得傳過來的Object類型的變量objDataIn--------
jclass clazz =(env)->FindClass("ObjData");
//從傳進來的對象中取出byte[]
- jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");
- jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn,byteData);
- jsize theArrayLeng = env->GetArrayLength(pDataIn);
//byte[]轉爲BYTE[]
//將BYTE數組轉爲jarray
- jbyte* byte = (jbyte*)jDataOut;
- jbyteArray jarray = env->NewByteArray(theArrayLeng);
- env->SetByteArrayRegion(jarray, 0, theArrayLeng, byte);
//給每一個實例的變量付值
- (env)->SetObjectField(objDataIn,byteData,jarray);
- (env)->SetIntField(objDataIn,pDataInLen,jDataInLen);
- (env)->ReleaseByteArrayElements(pDataIn, arrayBody, 0);
jfieldID fid ;
jstring jstr ;
const char *str ;
jclass cl = (*env)->GetObjectClass( obj) ;
fid = env->GetFieldID( cls, "s", "Ljava/lang/String;") ;
jstr = env->GetObjectField( obj, fid) ;
str = env->GetStringUTFChars( jstr, NULL) ;
jstr = env->NewStringUTF( "123") ;
env->SetObjectField( obj, fid, jstr) ;
http://consuela-zhao.iteye.com/blog/869532