JNI - java ArrayList 转换为 c++ std::string*

2023-12-21

我正在尝试使用 C++ 中的 JNI 进行数据转换。我在工作中遇到了麻烦java's 数组列表 of strings,因为我无法将这样的数据转换为c++ vector or 标准::字符串*.

我想知道如果可能的话,如何在不牺牲太多性能的情况下进行这种转换。任何想法,将不胜感激。


我不知道这是否符合您的性能要求,但这可能是一个好的开始。

对于这两个选项,假设jobject jList;是你的ArrayList。

Option 1

将 List 转换为数组并迭代该数组(如果您有 LinkedList 而不是 ArrayList,可能更适用)

// retrieve the java.util.List interface class
jclass cList = env->FindClass("java/util/List");

// retrieve the toArray method and invoke it
jmethodID mToArray = env->GetMethodID(cList, "toArray", "()[Ljava/lang/Object;");
if(mToArray == NULL)
    return -1;
jobjectArray array = (jobjectArray)env->CallObjectMethod(jList, mToArray);

// now create the string array
std::string* sArray = new std::string[env->GetArrayLength(array)];
for(int i=0;i<env->GetArrayLength(array);i++) {
    // retrieve the chars of the entry strings and assign them to the array!
    jstring strObj = (jstring)env->GetObjectArrayElement(array, i);
    const char * chr = env->GetStringUTFChars(strObj, NULL);
    sArray[i].append(chr);
    env->ReleaseStringUTFChars(strObj, chr);
}

// just print the array to std::cout
for(int i=0;i<env->GetArrayLength(array);i++) {
    std::cout << sArray[i] << std::endl;
}

Option 2

另一种选择是使用List.size() and List.get(int)方法从列表中检索数据。当您使用 ArrayList 时,此解决方案也可以,因为 ArrayList 是 RandomAccessList。

// retrieve the java.util.List interface class
jclass cList = env->FindClass("java/util/List");

// retrieve the size and the get method
jmethodID mSize = env->GetMethodID(cList, "size", "()I");
jmethodID mGet = env->GetMethodID(cList, "get", "(I)Ljava/lang/Object;");

if(mSize == NULL || mGet == NULL)
    return -1;

// get the size of the list
jint size = env->CallIntMethod(jList, mSize);
std::vector<std::string> sVector;

// walk through and fill the vector
for(jint i=0;i<size;i++) {
    jstring strObj = (jstring)env->CallObjectMethod(jList, mGet, i);
    const char * chr = env->GetStringUTFChars(strObj, NULL);
    sVector.push_back(chr);
    env->ReleaseStringUTFChars(strObj, chr);
}

// print the vector
for(int i=0;i<sVector.size();i++) {
    std::cout << sVector[i] << std::endl;
}

_编辑:用 NULL_ 替换 JNI_FALSE
_编辑:用push_back_替换插入

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNI - java ArrayList 转换为 c++ std::string* 的相关文章

随机推荐

  • 在可移动和不可复制的类上使用移动和交换习惯是否有意义

    如果我有这样的课程 class Foo public Foo Foo Foo rhs operator Foo rhs swap this rhs void swap Foo rhs private Foo const Foo snip s
  • Dropbox oauth 窗口无法正常工作

    我正在将我的应用程序移植到 Electron 我惊讶地发现 Dropbox 身份验证在此环境中不起作用 不过它在 Chrome 中确实有效 登录按钮保持禁用状态 并且标签出现在输入上方 控制台中显示以下消息 Content Security
  • 尝试将应用程序提交到应用程序商店时 Xcode 崩溃[重复]

    这个问题在这里已经有答案了 我正在尝试提交一个应用程序 我将其存档 然后尝试提交它 结果崩溃了 我查找了此问题的潜在解决方案 他们说只需转到首选项 gt 帐户 gt 并更新以确保您已同意所有新条款 所以我这样做并再次尝试 现在它仍然崩溃 我
  • Ruby:一类的子类之后的[数字]的语法名称[重复]

    这个问题在这里已经有答案了 我正在通过示例学习 Ruby on Rails 我在迁移文件夹中看到这里是一个示例代码 class RemoveOrderListNumberAndStateFromOrderLists lt ActiveRec
  • 渲染许多连接的四开文档

    我一直在尝试新的quarto https quarto org Rstudio 的工具 似乎我无法做旧版本中可以做的事情R笔记本 or R Markdown备择方案 我想通过几个四开文档 qmd 组织我的工作流程 并且我想生成 html 文
  • 调用 twig 扩展时出现未知函数错误

    我正在寻找创建一个 twig 扩展 但 Symfony 一直告诉我我的功能未知 这是我的课程
  • Managed Oracle ODP.NET 驱动程序是否使用网络加密?

    我最近读到 Oracle 支持 Oracle 客户端和服务器之间的网络加密 我假设 如果服务器支持此功能 客户端就可以在各种 Oracle 数据访问提供程序库使用的完整 Oracle 客户端驱动程序中完成连接 但是 我的应用程序使用来自 O
  • 如何在 SQL Server 中存储和检索 varbinary(max) 列

    我正在开发一个应用程序 我想将用户的指纹存储到数据库中 然后将其与从设备中获取的指纹进行比较 我在转换时遇到了某些问题varbinary max 列返回一个字节 我尝试过使用GetSqlBinary功能但它给了我indexoutofrang
  • 自动选择 WPF TextBox 中焦点上的所有文本

    如何自动选择 WPF 文本框中焦点上的所有文本 乔纳森 通过向应用程序添加全局事件处理程序 您可以非常轻松地做到这一点 http madprops org blog wpf textbox selectall on focus http m
  • 如何使用 Promise 等待 observable 的每个值

    假设我有这个可观察的 const obs new Observable observer gt observer next 0 25 observer next 0 75 observer next new ArrayBuffer 100
  • 用户体验问题:“严重删除”或“垃圾”更好

    我正在开发一个应用程序 允许用户管理一些单独的数据点 我的用户想要做的事情之一是 删除 但这意味着什么 对于 Web 应用程序来说 向用户提供严重删除或使用 垃圾 系统的选项是否更好 在 严重删除 下 很想知道是否有更好的名称 您单击 删除
  • 使用空初始化器列表直接初始化

    struct X X std cout lt lt default ctor lt lt std endl int main X 这打印出来 default ctor 这是有道理的 因为空大括号值初始化了对象 我认为 然而 struct X
  • 即使视口元标记中的分辨率宽度为 1536,ipad 3 设备宽度是否始终为 768?

    我正在尝试了解 ios 设备的视口元标记 我创建了一个测试页面 在其中插入了一张 862 像素宽的图像 所以我的视口元标记为 然而在ipad 3上 分辨率宽度为1536像素 并将视口设置为与ipad 3相同的可见区域大小 862px图像被放
  • Intellij 工作表和其中定义的类

    我正在学习 Coursera 的 Scala 函数式编程课程 并发现工作表 repl 出现了奇怪的行为 在课程中 包含以下代码的工作表应在右侧给出以下结果 object rationals val x new Rational 1 2 gt
  • 获取对象为 null 的对象的类型?

    以下代码可以编译 但为什么会出现运行时异常 String b null System out println b getClass 我得到的错误是 java lang NullPointerException 即使对象设置为 null 如何
  • Cocos2d播放2个不同的背景音乐文件或循环播放效果

    我需要为场景提供背景音乐 为角色提供背景音乐 但是当角色做出某些动作时我必须停止它 对于这个问题我必须选择 同时播放2个背景音乐文件 并停止与角色相关的背景音乐文件 循环播放音效 这 2 种中哪一种是可能且推荐的 Regards 你说你正在
  • 非交互式 bash 中的别名[重复]

    这个问题在这里已经有答案了 我想让别名在非交互式 bash 中工作 我运行以下命令 bash c alias toto ls shopt s expand aliases alias toto ls toto 我得到以下信息 bash to
  • SeekBar - 使用上面的 TextView 显示进度

    我正在尝试 肯定很简单 任务 让 TextView 跟随进度条上的拇指并在 TextView 中显示进度 问题是 对于小于最大值一半的进度值 TextView 会向拇指左侧漂移 越来越远离正确位置 反之亦然 当进度值大于最大值一半时 Tex
  • 如何在Java中将getRGB(x,y)整数像素转换为Color(r,g,b,a)?

    我有从中获得的整数像素getRGB x y 但我不知道如何将其转换为 RGBA 格式 例如 16726016应该Color 0 200 0 255 有小费吗 如果我猜对了 你得到的是一个无符号整数的形式0xAARRGGBB so int b
  • JNI - java ArrayList 转换为 c++ std::string*

    我正在尝试使用 C 中的 JNI 进行数据转换 我在工作中遇到了麻烦java s 数组列表 of strings 因为我无法将这样的数据转换为c vector or 标准 字符串 我想知道如果可能的话 如何在不牺牲太多性能的情况下进行这种转