【问题标题】:JNI setting Static Field String ArrayJNI设置静态字段字符串数组
【发布时间】:2012-09-28 16:02:17
【问题描述】:

我试图在我的班级中设置一个字符串数组字段,但遇到了各种各样的问题。这是我到目前为止所拥有的:

JNIEXPORT jint JNICALL Java__Names1_GetMyNames(JNIEnv *env, jobject obj)
{
jfieldID myNamesID; /* store the field ID */
int i=0;
jstring myStr;
jobject dev;
char* myNames[] = {"Hello ", "world!"};

// Get a reference to obj’s class 
jclass cls = env->GetObjectClass(obj);
// Get static field ID
myNamesID = env->GetStaticFieldID(cls, "myDevNames", "[Ljava/lang/String;");
// Get the object field
dev = env->GetObjectField(obj,myNamesID);

for (i=0; i<2; i++) {
myStr = env->NewStringUTF(myNames[i]);
env->SetObjectArrayElement(dev,i,myStr);
}
return 0;
}

这是我的字符串:

private static String[] myDevNames= new String[12];

当我尝试编译时,出现以下错误:

错误:从 'jobject {aka _jobject*}' 到 'jobjectArray {aka _jobjectArray*}' 的无效转换 [-fpermissive]

任何想法我做错了什么?任何帮助将不胜感激。

【问题讨论】:

    标签: arrays string static java-native-interface


    【解决方案1】:

    更新 - 我之前使用 jarray 代替 jobject 的建议是不正确的。我正在查看旧文档。基于http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html 这个怎么样?将 dev 重新定义为 jobjectArray,但您还需要对 GetStaticObjectField 的调用进行强制转换。

    JNIEXPORT jint JNICALL Java__Names1_GetMyNames(JNIEnv *env, jobject obj)
    {
    jfieldID myNamesID; /* store the field ID */
    int i=0;
    jstring myStr;
    jobjectArray dev;
    char* myNames[] = {"Hello ", "world!"};
    
    // Get a reference to obj’s class 
    jclass cls = env->GetObjectClass(obj);
    // Get static field ID
    myNamesID = env->GetStaticFieldID(cls, "myDevNames", "[Ljava/lang/String;");
    // Get the object field
    dev = static_cast<jobjectArray>(env->GetStaticObjectField(cls,myNamesID));
    
    for (i=0; i<2; i++) {
    myStr = env->NewStringUTF(myNames[i]);
    env->SetObjectArrayElement(dev,i,myStr);
    }
    return 0;
    }
    

    【讨论】:

    • 将 jobject dev 更改为 jobjectArray 或 jarray 仍然给我编译错误:错误:从 'jobject {aka _jobject*}' 到 'jobjectArray {aka _jobjectArray*}' 的无效转换 [-fpermissive]跨度>
    • 好的,现在它可以编译了,但是一旦我运行它就会崩溃。例外是 pc=0x000000005957cdd0, pid=11632, tid=12036 的 EXCEPTION_ACCESS_VIOLATION (0xc0000005)
    • 好的,当我将我的字段从静态更改为实例并使用 GetFieldID 时,它看起来很有效。当我使用静态字段时,它会崩溃。任何想法为什么?感谢您迄今为止的帮助,非常感谢。
    • 我去看看。我需要搭建一个测试环境。
    • 噢!当您使用 GetStaticFieldID 时,您必须使用 GetStaticObjectField
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多