gpt4 book ai didi

c - .c语言中的jstring比较该怎么办

转载 作者:行者123 更新时间:2023-11-30 18:37:11 29 4
gpt4 key购买 nike

如何用c语言比较两个jstring。我需要这个来执行jni,其中逻辑写在.c文件中用于比较两个名称

最佳答案

** 编辑 **

根据 @JonasVautherin 评论:

虽然不会导致错误,但这是极少数情况下使用 strncmp 可以替换为 strcmp 而不必担心阅读超出字符串范围。

原因是从 jvm 获取的 native 字符串是有效的空终止字符串,因此在这种情况下不会发生溢出,这就是 strncmp 所保证的。

这也是为什么 strncmp 在这种情况下不会导致错误 - 它会在任一字符串上的\0 处终止,或者直到达到读取的字符数(引用:https://www.cplusplus.com/reference/cstring/strncmp/)

如果你想使用纯原生:

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString1, jstring javaString2)   
{
const char *nativeString1 = (*env)->GetStringUTFChars(env, javaString1, 0);
const char *nativeString2 = (*env)->GetStringUTFChars(env, javaString2, 0);

/* Now you can compare nativeString1 with nativeString2*/
int res = strncmp(nativeString1, nativeString2, strlen(nativeString1);

/* And don't forget to release the handles */

(*env)->ReleaseStringUTFChars(env, javaString1, nativeString1);
(*env)->ReleaseStringUTFChars(env, javaString2, nativeString2);
}

如果您想从 native 代码使用 Java(与 this one 相同的答案,所有功劳归原作者所有):

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString1, jstring javaString2)   
{
/* Get java class String handle */
jclass cls = (*env)->GetObjectClass(env, javaString1);
/* Get method ID equals from String handle */
jmethodID mID = (*env)->GetMethodID(env, cls, "equals", "(Ljava/lang/Object;)Z");
/* Compare both methods, store in jboolean which can be case to uint8_t or bool if you're using C99*/
jboolean equals = (*env)->CallBooleanMethod(env, javaString1, mID, javaString2);
}

关于c - .c语言中的jstring比较该怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38204876/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com