c++ - JNI 中的比较

标签 c++ java-native-interface

这是一个“愚蠢的问题:可以在 JNI 中比较两个 jstrings 吗?如果可以,如何比较?

最佳答案

你有 2 个选项(我假设你想比较平等...)

  1. 将两个 jstrings 转换为 wstrings 并比较
  2. 调用 jstring 的 equals 方法(但是这需要调用 JVM 几次,因此会比选项 1 慢。)

对于选项 1,您想尝试如下操作。我没有选项 2 的源代码。

警告 我还没有编译它,甚至没有测试它,但你可能想要这样的东西。如果 java 字符串包含除 ASCI 字符以外的任何内容,我认为其中存在错误。我也没有做任何错误检查。

jbyteArray bytes = 0;
jclass localClass = env->FindClass("java/lang/String");
jmethodID methodID = env->GetMethodID(localClass, "getBytes", "()[B");
bytes = (jbyteArray)env->CallObjectMethod( jstr, methodID);
jint len = env->GetArrayLength( bytes);
char* data = new char[len+1];
env->GetByteArrayRegion( bytes, 0, len,(jbyte *)data);
data[len] = 0;

std::wstring result(data);

对第二个jstring做同样的事情,然后比较2个std::wstring

关于c++ - JNI 中的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599407/

相关文章:

c++ - ADL 在同名成员函数的情况下

c++ - 我如何将此 int 数组的一部分复制到 C++ 中的另一个?

c++ - 选择两个城市的概率C++

java - JNI printf 到 log4j

c++ - 我的 int to hex 函数有什么问题?

c++ - 在 gimple 中插入函数调用

java - 我应该如何从 JNI 调用中流式传输大型二进制结果?

c++ - 共享内存中彼得森锁的问题

c++ - 是否可以跨 RTLD_LOCAL 加载的库合并 vtables/typeinfo 等弱符号?

Android - NDK - C++ - 无法使用 'int *' 类型的右值(又名 'jlong *')初始化 'long long *' 类型的变量