android – 对NewObject调用的无效间接引用

android – 对NewObject调用的无效间接引用,第1张

概述好的,所以我有下面的本机代码. 我试图从它返回一个FilePermissionInfo数组,填充stat()返回的一些数据. 问题是第一次调用NewObject时出现以下错误: 06-15 20:25:17.621: W/dalvikvm(2287): Invalid indirect reference 0x40005820 in decodeIndirectRef 06-15 20:25:17 好的,所以我有下面的本机代码.
我试图从它返回一个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调用的无效间接引用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1136844.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存