Android Jni 类型的转化,传递数据
项目需要做android jni的东西,初次学习,现将学习的结果记录总结如下:
C++中的char数组转为Jstring:
jstring stoJstring(JNIEnv* env, const char* pat) { int strLen = strlen(pat); jclass jstrObj = (env)->FindClass("java/lang/String"); jmethodID methodId = (env)->GetMethodID(jstrObj, "<init>", "([BLjava/lang/String;)V"); jbyteArray byteArray = (env)->NewByteArray( strLen); jstring encode = (env)->NewStringUTF("gbk"); (env)->SetByteArrayRegion(byteArray, 0, strLen, (jbyte*)pat); return (jstring)(env)->NewObject(jstrObj, methodId, byteArray, encode); }
C++中的unsigned char (byte)数组转为JbyteArray
jbyteArray chartoByteArray(JNIEnv* env, byte* pat,int nOutSize) { LOGI("length=%d",nOutSize); jbyte *by = (jbyte*)pat; jbyteArray jarray = env->NewByteArray(nOutSize); (env)->SetByteArrayRegion(jarray, 0, nOutSize, (jbyte*)pat); // free(pat); return jarray; }
Jstring转为C++的char[]
char* jstringTostring(JNIEnv* env, jstring jstr) { 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; }
Jni中生成Android java 层声明的类
jclass objectClass = (env)->FindClass("com/xxx/xxx/entity/类名"); //找到上层的java声明的类 jmethodID constructorID; constructorID = (env)->GetMethodID(objectClass, "<init>", "()V"); //找到java层的初始化函数 jobject findResultObject = NULL; findResultObject = (env)->NewObject(objectClass, constructorID);//实例化对象
Jni层对 java类的成员进行赋值
jfieldID imgpath = (env)->GetFieldID(objectClass,"bitmapPath","Ljava/lang/String;"); //bitmapPath是上层类的成员变量 (env)->SetObjectField(findResultObject,imgpath,stoJstring(env,path));
浙公网安备 33010602011771号