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以下代码可以帮助您。
这个就不须解释啦吧。
我是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;
}
这个就不须解释啦吧。