jni 註冊方法

文件讀取

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";

 jstring rtstr = env->NewStringUTF(tmpstr);
 
 
 
  下面是訪問String的一些方法:
  ◆GetStringUTFChars將jstring轉換成爲UTF-8格式的char*
  ◆GetStringChars將jstring轉換成爲Unicode格式的char*
  ◆ReleaseStringUTFChars釋放指向UTF-8格式的char*的指針
  ◆ReleaseStringChars釋放指向Unicode格式的char*的指針
  ◆NewStringUTF創建一個UTF-8格式的String對象
   ◆NewString創建一個Unicode格式的String對象
  ◆GetStringUTFLengt獲取 UTF-8格式的char*的長度 
  ◆GetStringLength獲取Unicode格式的char*的長 度
 
 
將整形數組轉換爲 jintArray;
 jintArray iArray  =  env->NewIntArray(size); ;
int arry[] = { 102, 123, 463, 505, 77, 98, 99, 100 };
 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數組

C代碼  收藏代碼
  1. jbyte * arrayBody = env->GetByteArrayElements(data,0);
  2. jsize theArrayLengthJ = env->GetArrayLength(data);
  3. BYTE * starter = (BYTE*)arrayBody;



jbyteArray 轉 c++中的BYTE[]

C代碼  收藏代碼
  1. //jbytearray strIn
  2. jbyte * olddata = (jbyte*)env->GetByteArrayElements(strIn,0);
  3. jsize oldsize = env->GetArrayLength(strIn);
  4. BYTE* bytearr = (BYTE*)olddata;
  5. int len = (int)oldsize;



jbyteArray 轉 char *

C代碼  收藏代碼
  1. char* data = (char*)env->GetByteArrayElements(strIn,0);


char* 轉jstring

C代碼  收藏代碼
  1. jstring WindowsTojstring(JNIEnv* env, char*str_tmp)
  2. {
  3. jstring rtn=0;
  4. int slen = (int)strlen(str_tmp);
  5. unsigned short* buffer=0;
  6. if(slen == 0)
  7. {
  8. rtn = env->NewStringUTF(str_tmp);
  9. }
  10. else
  11. {
  12. int length = MultiByteToWideChar(CP_ACP,0, (LPCSTR)str_tmp, slen, NULL, 0);
  13. buffer = (unsigned short*)malloc(length*2+1);
  14. if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer,length) > 0)
  15. {
  16. rtn = env->NewString((jchar*)buffer, length);
  17. }
  18. }
  19. if(buffer)
  20. {
  21. free(buffer);
  22. }
  23. return rtn;
  24. }



下面這個沒有用過,剛看到,也寫進來,以後如果遇到可以驗證下看。

jstring 轉 char* 或者 const char*

C代碼  收藏代碼
  1. // jstring str
  2. const char *key = env->GetStringUTFChars(str, 0);
  3. //jboolean isOffer
  4. jsClient->modify(key, isOffer);
  5. env->ReleaseStringUTFChars(str, key);



JNI 返回 jbyteArray

C代碼  收藏代碼
  1. JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv*env, jobject obj)
  2. {
  3. jbyteArray firstMacArray = env->NewByteArray(6 );
  4. ......
  5. jbyte *bytes = env->GetByteArrayElements(firstMacArray, 0);
  6. for ( inti = 0; i < sizeof( pAdapterInfo->Address); i++ )
  7. {
  8. bytes[ i ] = pAdapterInfo->Address[i ];
  9. }
  10. env->SetByteArrayRegion(firstMacArray, 0, 6, bytes );
  11. return firstMacArray;
  12. }



//jstring to char*

C代碼  收藏代碼
  1. char* jstringTostring(JNIEnv* env, jstringjstr)
  2. {
  3. char* rtn = NULL;
  4. jclass clsstring = env->FindClass("java/lang/String");
  5. jstring strencode = env->NewStringUTF("utf-8");
  6. jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
  7. jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid, strencode);
  8. jsize alen = env->GetArrayLength(barr);
  9. jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
  10. if (alen > 0)
  11. {
  12. rtn = (char*)malloc(alen+ 1);
  13. memcpy(rtn, ba, alen);
  14. rtn[alen] = 0;
  15. }
  16. env->ReleaseByteArrayElements(barr, ba, 0);
  17. return rtn;
  18. }



//char* to jstring

C代碼  收藏代碼
  1. jstring stoJstring(JNIEnv* env, constchar* pat)
  2. {
  3. jclass strClass = env->FindClass("Ljava/lang/String;");
  4. jmethodID ctorID = env->GetMethodID(strClass, "<init>","([BLjava/lang/String;)V");
  5. jbyteArray bytes = env->NewByteArray(strlen(pat));
  6. env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
  7. jstring encoding = env->NewStringUTF("utf-8");
  8. return (jstring)env->NewObject(strClass, ctorID,bytes, encoding);
  9. }



//將jstring類型轉換成windows類型

C代碼  收藏代碼
  1. char* jstringToWindows( JNIEnv *env, jstring jstr )
  2. {
  3. int length = (env)->GetStringLength(jstr);
  4. const jchar* jcstr = (env)->GetStringChars(jstr,0 );
  5. char* rtn = (char*)malloc(length*2+1 );
  6. int size = 0;
  7. size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr,length, rtn,(length*2+1), NULL, NULL );
  8. if( size <= 0 )
  9. return NULL;
  10. (env)->ReleaseStringChars(jstr, jcstr );
  11. rtn[size] = 0;
  12. return rtn;
  13. }


//將windows類型轉換成jstring類型

C代碼  收藏代碼
  1. jstring WindowsTojstring( JNIEnv* env, char*str )
  2. {
  3. jstring rtn = 0;
  4. int slen = strlen(str);
  5. unsigned short * buffer = 0;
  6. if( slen == 0 )
  7. rtn = (env)->NewStringUTF(str );
  8. else
  9. {
  10. int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL,0 );
  11. buffer = (unsigned short *)malloc(length*2 + 1 );
  12. if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer,length ) >0 )
  13. rtn = (env)->NewString( (jchar*)buffer, length );
  14. }
  15. if( buffer )
  16. free( buffer );
  17. return rtn;
  18. }




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[]

C代碼  收藏代碼
  1. jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");
  2. jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn,byteData);
  3. jsize theArrayLeng = env->GetArrayLength(pDataIn);


//byte[]轉爲BYTE[]

C代碼  收藏代碼
  1. jbyte * arrayBody = env->GetByteArrayElements(pDataIn,0);
  2. BYTE * jDataIn = (BYTE*)arrayBody;




//將BYTE數組轉爲jarray

C代碼  收藏代碼
  1. jbyte* byte = (jbyte*)jDataOut;
  2. jbyteArray jarray = env->NewByteArray(theArrayLeng);
  3. env->SetByteArrayRegion(jarray, 0, theArrayLeng, byte);



//給每一個實例的變量付值

C代碼  收藏代碼
  1. (env)->SetObjectField(objDataIn,byteData,jarray);
  2. (env)->SetIntField(objDataIn,pDataInLen,jDataInLen);
  3. (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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章