
我试图从它返回一个filePermissionInfo数组,填充stat()返回的一些数据.
问题是第一次调用NewObject时出现以下错误:
06-15 20:25:17.621: W/dalvikvm(2287): InvalID indirect reference
0x40005820 in decodeIndirectRef 06-15 20:25:17.621: E/dalvikvm(2287):
VM aborting
这很奇怪,因为我唯一的参考对象是jclass(对于filePermissionInfo),我把它变成了一个全局引用.
代码是:
JNIEXPORT jobjectArray JNICALLJava_com_mn_rootscape_utils_NativeMethods_getfilesPermissions( jnienv* env,jobject thizz,jobjectArray filePathsArray ) {jobjectArray result;int size = (*env)->GetArrayLength(env,filePathsArray);jboolean iscopy;jclass filePermInfoCls = (*env)->FindClass(env,kfilePermissionInfoPath);if(!filePermInfoCls){ LOGE("getfilesPermissions: Failed to get class reference."); return NulL;}gfilePermInfoClass = (jclass)(*env)->NewGlobalRef(env,filePermInfoCls);LOGI("got gfilePermInfoClass");jmethodID filePermInfoClsConstructor = (*env)->getmethodID(env,gfilePermInfoClass,"<init>",kfilePermInfoConstructorSig);if(!filePermInfoClsConstructor){ LOGE("getfilesPermissions: Failed to get method reference."); return NulL;}struct stat sb;LOGI("starting...");result = (jobjectArray)(*env)->NewObjectArray(env,size,NulL);for(int i = 0; i != size; ++i) { Jstring string = (Jstring) (*env)->GetobjectArrayElement(env,filePathsArray,i);const char *rawString = (*env)->GetStringUTFChars(env,string,&iscopy); if(stat(rawString,&sb) == -1) { LOGE("stat error for: %s",rawString); } LOGI("%ld %ld %ld %ld %ld %ld %ld %ld",sb.st_dev,sb.st_mode,sb.st_nlink,sb.st_uID,sb.st_gID,sb.st_atime,sb.st_mtime,sb.st_ctime); jobject permInfo = (*env)->NewObject(env,filePermInfoClsConstructor,(long)sb.st_dev,(long)sb.st_mode,(long)sb.st_nlink,(long)sb.st_uID,(long)sb.st_gID,(long)sb.st_atime,(long)sb.st_mtime,(long)sb.st_ctime,"",1,""); LOGI("xxx1"); (*env)->SetobjectArrayElement(env,result,i,permInfo); LOGI("xxx2"); (*env)->ReleaseStringUTFChars(env,rawString); LOGI("xxx3");}(*env)->DeleteLocalRef(env,filePermInfoCls);return result; }
java类构造函数签名和路径是:
const char* kfilePermissionInfoPath = "com/mn/rootscape/utils/filePermissionInfo";const char* kfilePermInfoConstructorSig = "(JJJJJJJJLjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V";
请注意,如果我在默认构造函数上调用NewObject,那么它可以正常工作.
解决方法 好的,找到了.这是Jstring参数的问题.事实证明,你不能将空字符串(或者甚至是NulL)作为Jstring传递.
相反,我使用(* env) – > NewStringUTF(env,NulL)来创建NulL Jstring.
好像现在好了.
由于这个问题产生了一定程度的高活动,我将在下面发布最终解决方案.请注意,nullString变量在其作用域的末尾(或者当您使用它时)被释放:
Jstring nullString = (*env)->NewStringUTF(env,NulL);... jobject permInfo = (*env)->NewObject(env,(jbyte)permsOwner,(jbyte)permsGroup,(jbyte)permsOthers,(jlong)sb.st_uID,(jlong)sb.st_gID,(jlong)sb.st_atime,(jlong)sb.st_mtime,(jlong)sb.st_ctime,nullString,(jboolean)1,nullString);... (*env)->DeleteLocalRef(env,nullString);总结
以上是内存溢出为你收集整理的android – 对NewObject调用的无效间接引用全部内容,希望文章能够帮你解决android – 对NewObject调用的无效间接引用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)