我是java调C
jclass strClass = (*env)->FindClass(env, "java/lang/String;");
LOGD("strClass===%s\n", strClass);
打印总是为null,就是strClass为NULL。
这是怎么回事?代码哪里有问题?
jclass strClass = (*env)->FindClass(env, "java/lang/String;");
LOGD("strClass===%s\n", strClass);
打印总是为null,就是strClass为NULL。
这是怎么回事?代码哪里有问题?
解决方案 »
- java获取adb命令返回信息问题
- 如何实现微博帐号登陆第三方网站
- 控制每秒刷新固定帧数,线程休眠、等待哪个更合理
- android 计时器,在黑屏情况下不计时,那位大哥帮忙看看···急急急急急急········、
- 运用Proxy模式简化的Service的管理和使用的实例(附源码及工程文件)
- android利用jni获取自己apk的签名。
- Android代码生成的布局里,既有横向的又要有纵向的怎么实现?
- webview记载https加密的flash显示空白
- 如何通过点击listview中的item来获取item的详细信息
- 只想在内部数据访问,用SQLite好过ConentProvider吗?
- 如何将ImageView图片上传到服务器并保存?
- sqlite query 的问题
jclass strClass = (*env)->GetObjectClass(env, obj);
但是接下来的这句ctorID又打印为NULL,<get>是我在java里的native函数名.
jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<get>", "(Ljava/lang/String;)V");
JNIEnv* env = getJNIEnv();
jclass sclass = env->FindClass(classPathName);
//classPathName是我的类名(“com/game/jnicomponents/JNIQuickPlayer”)
jmethodID method_id = env->GetMethodID(sclass, "initSoundPlayer","()V");
env->CallVoidMethod(quickplayer_real_object, method_id);
env->DeleteLocalRef(sclass);不知道能不能帮到您。
quickplayer_real_object = env->NewGlobalRef(gObject);gObject就是jobject,我是在JAVA层写了一个native initC();的方法,它会调一下,于是就有jobject
"initSoundPlayer",这个是你在JAVA里面定义的native函数么?
"()V"这个呢?我要返回的是jstring类型的.我是要把一个char*数组转成jstring
你在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;
}这个就不须解释啦吧。