JNI设置静态字段字符串数组

3

我正在尝试在我的类中设置一个字符串数组字段,但是遇到了各种问题。目前我已经有如下代码:

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]
你有什么想法吗?任何帮助都将不胜感激。
1个回答

3

更新 - 我之前建议使用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仍然会导致编译错误:error: invalid conversion from 'jobject {aka _jobject*}' to 'jobjectArray {aka _jobjectArray*}' [-fpermissive] - CPL
现在编译通过了,但是一运行就崩溃了。异常信息是EXCEPTION_ACCESS_VIOLATION(0xc0000005),位于pc=0x000000005957cdd0,pid=11632,tid=12036。 - CPL
好的,看起来当我将我的字段从静态更改为实例并使用GetFieldID时它可以工作。当我使用静态字段时它会崩溃。有任何想法吗?非常感谢你迄今为止的帮助。 - CPL
我会看一下。我需要建立一个测试环境。 - Guido Simone
1
糟糕!当您使用GetStaticFieldID时,必须使用GetStaticObjectField。 - Guido Simone
@user1637425 如果它起作用了,那就给他一些信任吧!点赞并接受答案是你能做的最少的事情!我会点赞的。 - maba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接