如何在 JNI 中将 int 转换为 String(?)?

2024-01-01

我有一个int[ ]数组,我想将它的每个元素转换为String(?) in JNI,最后将它们连接为String(?)(包括逗号)。

例如:

// java code
int testIntArray = new int[]{1, 2, 3};
String arrayString = "";

jni.constructArrayString(testIntArray, arrayString);

// the print content should like this: 1,2,3
System.out.println("ArrayString: " + arrayString);

// jni code
JNIEXPORT void JNICALL constructArrayString (JNIEnv *env, jobject obj, jintArray jArr, jstring jstr) {
    // to do sth.
    // code maybe like the follow

    jint *arr = env -> GetIntArrayElements(jArr, 0);
    int len = env -> GetArrayLength(jArr);
    char *c_str = env -> GetStringUTFChars(jstr, 0);

    if(c_str == NULL) {
        return;
    }

    for(int i = 0; i < len; i++){
        // how to concatenate the arr[i], arr[i+1] and the comma ','
        // and finally make the arrayString like the string: 1,2,3 ?
    }
}

我知道,没有直接的方法可以转换int-type into 字符串类型数据或其他东西,但应该可以在JNI,并将它们连接为String终于!

如果很难做到void返回类型,改一下就可以了!提前致谢!

=================================================== ========================= 新问题:

首先,非常感谢@Jorn Vernee 的回答,这似乎是我应该采取的好方法。然而,当我尝试这种方式时,出现了一个棘手的问题std::字符串流。好吧,即使实例化它也会使应用程序崩溃。而且,遗憾的是我是新手JNI,没有调试 JVM 运行时错误导致的崩溃问题的经验。我查过@Moe Batainehquestion https://stackoverflow.com/questions/39709501/c-jni-crashes-hangs-when-doing-any-io-streams这看起来真的很像我,但是它在 Windows 上应用MiniGW or Cygwin有些事我不知道,所以对我来说很无助。

JNI 中的代码如下:

#include "utils_JniInterface.h"
#include <android/log.h>
#include <string.h>
#include <iostream>
#include <sstream>

using namespace std;

#define TAG "JNI-Log"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)

JNIEXPORT jstring JNICALL Java_utils_JniInterface_constructRGBArrayString (JNIEnv *env, jobject obj, jintArray jArr){
    jint *arr = env -> GetIntArrayElements(jArr, 0);
    int len = env -> GetArrayLength(jArr);

    std::stringstream result;

    for(int i = 0; i < len; i++) {
        result << arr[i];

        if(i < len - 1) {
            result << ',';
        }
    }

    env -> ReleaseIntArrayElements(jArr, arr, 0);

    return env -> NewStringUTF(result.str().data());
}

// int[] a = {1,2,3} ⇒ String b = "1,2,3"

对于这个问题有什么好的想法或者建议吗?


这非常简单:

JNIEXPORT jstring JNICALL Java_Main_callCPP(JNIEnv *env, jclass, jintArray ints) {
    jint* jints = env->GetIntArrayElements(ints, 0);
    int length = env->GetArrayLength(ints);

    std::stringstream result;
    for(int i = 0; i < length; i++) {
        result << jints[i];
        if(i < length - 1) {
            result << ',';
        }
    }

    env->ReleaseIntArrayElements(ints, jints, JNI_ABORT);

    return env->NewStringUTF(result.str().data());
}

Java 签名如下:

private static native String callCPP(int[] ints);

(当然,名称可以是您想要的任何名称)。及用法:

int[] ints = { 1, 2, 3 };
String result = callCPP(ints);
System.out.println(result); // prints '1,2,3'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JNI 中将 int 转换为 String(?)? 的相关文章

随机推荐

  • 如何操作Webkit窗口内的页面内容(使用QT和QTWebKit)?

    请帮助我理解 如何操作 qt webkit 窗口中显示的 html 内容 我需要简单的操作 例如填写输入字段和单击按钮 有这方面的建议 文章吗 请查看下面的示例 它用QWebView http chaos troll no tavestbo
  • 批处理脚本使setlocal变量被其他批处理文件访问

    我正在编写一个批处理文件来从文件中读取路径并将其设置为环境变量 该批处理文件将被许多其他批处理文件使用 调用 来获取变量 在编写批处理文件时 我遇到了变量扩展的问题 所以我使用了SETLOCAL ENABLEDELAYEDEXPANSION
  • 当我使用 GM_setValue 时,Greasemonkey/Tampermonkey 对我的 jQuery 对象做了什么?

    我正在尝试使用以下命令将 DOM 元素选择到 Tampermonkey 变量中GM setValue 以便稍后在不同页面上注入 我创建了一个示例 我可以使用普通 jQuery 来执行此操作 clone 但是当我将其设置为 Tampermon
  • Python 中的协程:最佳实践

    我想知道在 Python 3 中编写协程的最佳实践是什么 我正在开发基本方法 这些方法应该接受一些输入 使用 send 方法 对此输入执行计算 然后产生输出 我发现的第一种方法基本上是执行以下操作 def coroutine func da
  • 如何从 Access 中的对象获取准确的 LastUpdated 日期/时间?

    我正在尝试检索最近更新时间来自 Access 对象的日期 有时它返回 DateCreated 值 我看到相同的查询结果MSys对象 SELECT MSysObjects Name Switch Type 5 Query Type 32768
  • 如何在 UITests 下对单元格重新排序?

    随着UITests and UITableView我需要对单元格重新排序 是否可以 我试过myTable swipeDown 但它是在不响应重新排序的单元格中调用的 我怎样才能做到这一点 有可能吗 如果您已正确设置自定义单元格集的辅助功能属
  • 从多维数组中的特定列获取数组值[重复]

    这个问题在这里已经有答案了 该数组看起来像 arr array array a b array c d array e f 我想获取一个包含第一列中的值的数组 例如array a c e 我知道可以通过迭代数组并将值存储在另一个数组中来轻松
  • iOS 7 上 UITextview 撤消时出现奇怪的崩溃

    我收到了一堆崩溃报告 它们看起来很像下面的内容 但范围值不同 有时范围不是 0 x 而是 2 x 应用具体信息 由于未捕获的异常 NSRangeException 而终止应用程序 原因 NSBigMutableString substrin
  • Visual Studio 智能感知无法在一个 .ascx 文件中工作

    我在 ASP NET MVC 项目的同一文件夹中有两个 ascx 文件 其中之一智能感知工作正常 在另一种情况下 它根本不起作用 有任何想法吗 这些文件非常相似 顶部有相同的 control 定义 使用VS2008和C 尝试重建您的项目 智
  • 使用 FTPClient Java 检索文件内容

    我使用commons FTPCLIENT 我只想从 ftp 服务器获取文件内容 我不想将其写入临时文件 有什么办法可以做到这一点吗 fileoutputstream 应始终指向本地文件 提前致谢 Use FTPClient retrieve
  • 如何使用 git filter-repo 修改远程历史记录?

    过去我用过git filter branch从我的 git 历史记录中删除文件 接下来 我可以强制推送来更新远程存储库 例如 从本地存储库中删除所有 HTML 文件 然后重写远程文件以反映更改 git filter branch force
  • PowerShell 和全局函数

    为什么下面的代码不起作用 根据这篇文章 全局的用法应该是正确的 http technet microsoft com en us library ff730957 aspx http technet microsoft com en us
  • 显示原始值 Entity Framework 7

    我有一个跟踪添加 删除和修改的审核表 我在实体框架内跟踪这一点 而不是使用数据库触发器 原因有多种 但实际上是因为我们使用进程帐户 并且我想跟踪哪些用户对该记录进行了物理更改 我在 EF 5 中使用过此功能 但我不记得在 EF6 中也可以使
  • 在 C++20 模块中用于打破循环依赖的前向声明不起作用

    我已经在这个问题上绞尽脑汁好几天了 我读了很多关于新的 C 20 模块的文档和帖子 其中这个官方的 http www open std org jtc1 sc22 wg21 docs papers 2019 p1103r3 pdf this
  • SpriteKit 的 SKPhysicsBody 与多边形辅助工具

    我想知道是否有一个工具可以用来在 SpriteKit 中轻松生成复杂的物理体 我想要一个具有多边形形状的基于体积的物理实体 SpriteKit 允许使用该方法创建这样的物体 SKPhysicsBody bodyWithPolygonFrom
  • 在 Kotlin 中将元素添加到列表开头的最佳方法是什么

    如果我有一张这样的清单 var foo mutableListOf John Wayne 如果我想在列表顶部添加一个元素 到目前为止我正在考虑两个选项 First foo add 0 Twyla Second foo mutableList
  • c++构造对象时小括号和大括号有什么区别

    有什么区别 and 构造对象时 我认为 应该只支持initializer list或数组 但是当我在片段下方运行时 我感到困惑 include
  • 'This' 在 subscribe 中未定义

    我有一个订阅语句 我正在尝试调试它 但是当我在 VS Code 中单步执行时 this 在语句内始终未定义 在这种情况下 this dataLoaded 未定义 调试时如何让它不被定义 this router events filter e
  • 使用 sed 命令删除绝对路径

    我有包含以下上下文的文件 例如 abc include home user file txt some text 我需要删除包含以及包含后的完整路径 我使用了以下命令删除包含但没有删除路径 sed i r s include g 文件名 我
  • 如何在 JNI 中将 int 转换为 String(?)?

    我有一个int 数组 我想将它的每个元素转换为String in JNI 最后将它们连接为String 包括逗号 例如 java code int testIntArray new int 1 2 3 String arrayString