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

标签 java android c++ string java-native-interface

我有一个 int[ ] 数组,我想将它的每个元素转换成 String(?) 在 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 转换为 string-type 数据或其他东西,但应该在 JNI 中可操作,最后将它们连接为 String!

如果很难处理 void 返回类型,只需更改它!提前谢谢!

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

首先,非常感谢@Jorn Vernee 的回答,这似乎是我应该采取的好方法。然而,当我尝试这种方式时,出现了一个关于 std::stringstream 的棘手问题。好吧,即使实例化它也会使应用程序崩溃。遗憾的是,我是 JNI 的新手,没有调试 JVM 运行时错误导致的崩溃问题的经验。我检查了@Moe Bataineh question这看起来真的很像我,但是它在 Windows 上应用 MiniGWCygwin 一些我不知道的东西,所以这对我来说很无助。

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'

关于java - 如何在 JNI 中将 int 转换为 String(?)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801055/

相关文章:

java - 如何获取字符串数组并将它们进一步分成对象?

android - Android 4.4 设备可以充当 iBeacon 吗?

android - 使用 Android 服务的音频逐帧动画

C++ s.replace 不会用 "."替换 ".\n"

java - 带有正则表达式的Android拆分字符串不起作用

java - 如何更改从java中数据库接收的日期时间的显示格式

java - Intent.getStringExtra ("key")返回 null

android - 自定义插件从 Android Studio 添加依赖 beforeResolve

c++ - 尝试使用 OpenGL 时出错

c++ - Visual Studio 代码 clang 错误 : linker command failed with exit code 1 on Mac