JNI的一个有关问题

JNI的一个问题
我是java调C
jclass strClass = (*env)->FindClass(env, "java/lang/String;");
 LOGD("strClass===%s\n", strClass);
打印总是为null,就是strClass为NULL。
这是怎么回事?代码哪里有问题?

------解决方案--------------------

你在JAVA类中多写一个native initC()的方法。程序System.load("");的时候会自动调用C中的jniload方法。在这个方法中注册各种native方法,和保存event.

程序运行的时候你在JAVA层调一下Object.initC();这样就会调到c层的initC();在这个方法中保存一下jobject,至于char转jstring,jstring 转char以下代码可以帮助您。


#include <OperateSymbol.h>

jstring s2Jstring(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);
}

char* jstring2string(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;
}

这个就不须解释啦吧。

引用:
引用:quickplayer_real_object是一个对象的实例
quickplayer_real_object = env->NewGlobalRef(gObject);

gObject就是jobject,我是在JAVA层写了一个native initC();的方法,它会调一下,于是就有jobject

引用 5 楼 L……