java native interface JNI 调用Java方法(二)

2014-11-23 21:59:37 · 作者: · 浏览: 1
(env, jstr, str);

这里使用GetStringUTFChars方法将传进来的prompt(jstring类型)转换成为UTF-8的格式,就能够在本地方法中使用了。
注意:在使用完你所转换之后的对象之后,需要显示调用ReleaseStringUTFChars方法,让JVM释放转换成UTF-8的string的对象的空间,如果不显示的调用的话,JVM中会一直保存该对象,不会被垃圾回收器回收,因此就会导致内存溢出。

下面是Jni访问String对象的一些方法:

  • GetStringUTFChars 将jstring转换成为UTF-8格式的char*
  • GetStringChars 将jstring转换成为Unicode格式的char*
  • ReleaseStringUTFChars 释放指向UTF-8格式的char*的指针
  • ReleaseStringChars 释放指向Unicode格式的char*的指针
  • NewStringUTF 创建一个UTF-8格式的String对象
  • NewString 创建一个Unicode格式的String对象
  • GetStringUTFLength 获取UTF-8格式的char*的长度
  • GetStringLength 获取Unicode格式的char*的长度

    下面提供两个String对象和char*互转的方法:

    /* c/c++ string turn to java jstring */
    jstring charToJstring(JNIEnv* env, const char* pat)
    {
    jclass strClass = (*env)->FindClass(env, "java/lang/String");
    jmethodID ctorID = (*env)->GetMethodID(env, strClass, "", "([BLjava/lang/String;)V");
    jbyteArray bytes = (*env)->NewByteArray(env, strlen(pat));
    (*env)->SetByteArrayRegion(env, bytes, 0, strlen(pat), (jbyte*)pat);
    jstring encoding = (*env)->NewStringUTF(env, "UTF-8");
    return (jstring)(*env)->NewObject(env, strClass, ctorID, bytes, encoding);
    }


    /* java jstring turn to c/c++ char* */
    char* jstringToChar(JNIEnv* env, jstring jstr)
    {
    char* pStr = NULL;
    jclass jstrObj = (*env)->FindClass(env, "java/lang/String");
    jstring encode = (*env)->NewStringUTF(env, "utf-8");
    jmethodID methodId = (*env)->GetMethodID(env, jstrObj, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray byteArray = (jbyteArray)(*env)->CallObjectMethod(env, jstr, methodId, encode);
    jsize strLen = (*env)->GetArrayLength(env, byteArray);
    jbyte *jBuf = (*env)->GetByteArrayElements(env, byteArray, JNI_FALSE);
    if (jBuf > 0)
    {
    pStr = (char*)malloc(strLen + 1);
    if (!pStr)
    {
    return NULL;
    }
    memcpy(pStr, jBuf, strLen);
    pStr[strLen] = 0;
    }
    env->ReleaseByteArrayElements(byteArray, jBuf, 0);
    return pStr;
    }

    其实在JNI中调用java的特性和在java中差别不大都是相同思想,比如先找类,再找构造,再创建对象,然后就进行一系列操作...等等。

    参考:http://zhiweiofli.iteye.com/blog/1830321

    如有问题请留言,转载注明出处。