Java 如何在JNI中将int转换为字符串(?)?

Java 如何在JNI中将int转换为字符串(?)?,java,android,c++,string,java-native-interface,Java,Android,C++,String,Java Native Interface,我得到了一个int[]数组,我想在JNI中将它的每个元素转换成String(?),最后将它们连接成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 Syst

我得到了一个int[]数组,我想在JNI中将它的每个元素转换成String(?),最后将它们连接成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代码
JNIEXPORT void JNICALL ConstructuraryString(JNIEnv*env、jobject obj、jintArray jArr、jstring jstr){
//做某事。
//代码可能如下所示
jint*arr=env->GetIntArrayElements(jArr,0);
int len=env->GetArrayLength(jArr);
char*c_str=env->GetStringUTFChars(jstr,0);
如果(c_str==NULL){
返回;
}
对于(int i=0;i
我知道,没有一种直接的方法可以将int类型转换为字符串类型数据或其他东西,但是应该可以在JNI中操作,并最终将它们连接为字符串

如果很难使用void返回类型,只需更改它!Thanx,提前

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

首先,非常感谢@Jorn Vernee的回答,这似乎是我应该采取的好方法。然而,当我尝试这种方法时,出现了一个关于std::stringstream的棘手问题。即使实例化它也会使应用程序崩溃。遗憾的是,我对JNI不熟悉,没有调试JVM运行时错误的崩溃问题的经验。我已经检查了@Moe Bataineh,它看起来真的很像我,但是它适用于带有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"
#包括“utils\u JniInterface.h”
#包括
#包括
#包括
#包括
使用名称空间std;
#定义标记“JNI日志”
#定义LOGD(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uDebug、标记、参数)
JNIEXPORT jstring JNICALL Java_utils_JniInterface_ConstructorGBaryString(JNIEnv*env、jobject obj、jintArray jArr){
jint*arr=env->GetIntArrayElements(jArr,0);
int len=env->GetArrayLength(jArr);
std::stringstream结果;
对于(int i=0;i

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

这很简单:

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());
}
(当然名称可以是您想要的任何名称)。用法:

int[] ints = { 1, 2, 3 };
String result = callCPP(ints);
System.out.println(result); // prints '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());
}
(当然名称可以是您想要的任何名称)。用法:

int[] ints = { 1, 2, 3 };
String result = callCPP(ints);
System.out.println(result); // prints '1,2,3'
有用链接: 当使用std::stringstream时,我还得到了以下错误:

致命错误:找不到“sstream”文件

#包括
^生成1个错误

帮助我的解决方案是创建一个名为“Application.mk”的文件(注意:区分大小写)。您需要添加的唯一一行是:

应用程序\u STL:=stlport\u静态

将“Application.mk”文件放在您的“jni”文件夹中这是您的“Android.mk”文件所在的位置。这在eclipse中对我有效,我可以假设它也适用于Android studio。 以下是与备选方案的链接: 希望这有助于@frank jorsn

有帮助的链接: 当使用std::stringstream时,我还得到了以下错误:

致命错误:找不到“sstream”文件

#包括
^生成1个错误

帮助我的解决方案是创建一个名为“Application.mk”的文件(注意:区分大小写)。您需要添加的唯一一行是:

应用程序\u STL:=stlport\u静态

将“Application.mk”文件放在您的“jni”文件夹中这是您的“Android.mk”文件所在的位置。这在eclipse中对我有效,我可以假设它也适用于Android studio。 以下是与备选方案的链接:
希望这有帮助@frank jorsn

你是指Java字符串吗?你想把它也传递回Java吗?@Jorn Vernee不,我不是想在JNI中将int转换成字符串。我只是想让int的每个元素都[]数组可以操作并连接它们。如果没有必要,最好不要将其传回Java,只使用指针!您看过了吗?有一个名为
getIntarrayements
的方法,它只返回一个
jint*
,您可以将其视为
int[]
如果需要的话。您不能设置
数组字符串,字符串是不可变的。您必须创建一个新字符串。@Tom Blodget,这不是JNI练习。因为我需要解析一个大字符串数组(关于像素信息),所以我认为最好在JNI中打断它,以提高我的程序的效率。你是说一个Java字符串?你想把它也传递回Java吗?@Jorn Vernee不,我不是想在JNI中将int转换成字符串。我只是想使int[]的每个元素数组可以操作并连接它们。如果没有必要,最好不要将其传回Java,只使用指针!您看过了吗?有一个名为
getIntarrayements
的方法,它只返回一个
jint*
,您可以将其视为
int[]
如果需要的话。您不能设置
数组字符串,字符串是不可变的。您必须创建一个新字符串。@Tom Blodget,这不是JNI练习。因为我需要解析一个大字符串数组(关于像素信息),所以我认为最好在JNI中打破它,以提高我程序的效率。好吧,奇怪的是,当我应用std::stringstream方法时,我的演示应用程序崩溃了。发生了什么事?使用命名空间std时是否应该注意什么?或者是否应该配置一些设置?@frankjorsn请确保您使用的是这些确切的函数JVM不会检查它们是否符合CI
#include <sstream>