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

 

 

posted on 2012-12-13 15:26  爱老婆_爱工作  阅读(842)  评论(0)    收藏  举报

导航