我有一个 int [] 数组,我想将其中的每个元素转换为 String (?)在 JNI 中,最后将它们连接为 字符串 (?)(包括逗号)
例如:
// 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 返回类型很难处理,只需更改它即可! Thanx,提前!
=============================================== ============================ 新问题:
首先,感谢@Jorn Vernee回答这么多,这似乎是我应该采取的好方法。但是,当我尝试这种方式时,关于 std :: stringstream 的问题就出现了。好吧,即使实例化它也会使应用程序崩溃。而且,遗憾的是我是 JNI 的新手,没有调试JVM运行时错误的崩溃问题的经验。我检查了@Moe Bataineh question这真的像我一样,但它在Windows上应用 MiniGW 或 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"
有关此问题的任何好主意或建议吗?
答案 0 :(得分:0)
这很直截了当:
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'
答案 1 :(得分:0)
有用的链接:Issue regarding iostream in android NDK
使用 std :: stringstream 时,我也遇到以下错误;
致命错误:'sstream'文件未找到
#include <sstream>
^ 1生成错误。
帮助我的解决方案是创建一个名为“ Application.mk ”的文件(注意:区分大小写)。您需要添加的唯一一行是:
APP_STL:= stlport_static
将“ Application.mk ”文件放在“jni”文件夹中,这与“Android.mk”文件位于同一位置。这在eclipse中对我有用,我可以认为它也适用于android studio。
以下是替代方案的链接:Android ndk-build iostream: No such file or directory
希望这有助于@frank jorsn