我在这里就你的问题得到你的建议。对此我是新的蜜蜂,我从昨天开始就陷入困境,但无法解决。 我试图在JNI中找到2d数组大小,但是没有得到成功的结果。 我有以下代码。你能解决我的问题。
JNIEXPORT jint JNICALL Java_com_example_imagejoiner_MyJoiner_test(JNIEnv*
env,
jobject javaThis) {
LOGV("test print");
return 1;
}
JNIEXPORT void JNICALL
Java_com_example_imagejoiner_MyJoiner_joinNative(JNIEnv* env,
jobject javaThis, jobjectArray jfilePaths, jstring jfinalImagePath, int
verticalOverlapPercent, int horizontalOverlapPercent) {
const char *finalImagePath = env->GetStringUTFChars(jfinalImagePath, 0);
const int imageCount = env->GetArrayLength(jfilePaths);
int rows = 1;
int columns = 4;
Mat imageBuff[rows][columns];
/*for (int i = 0; i < imageCount; i++) {
jstring filePath = (jstring) env->GetObjectArrayElement( jfilePaths, i);
const char *rawString = env->GetStringUTFChars(filePath, 0);
LOGV("reading = %s", rawString);
imageBuff[i] = imread(rawString, 1);
if(!imageBuff[i].data) {
LOGV("failed to read = %s", rawString);
}
env->ReleaseStringUTFChars(filePath, rawString);
}*/
//Creating a 2 dimensional array from the lieaner array
int k = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
jstring filePath = (jstring) env->GetObjectArrayElement( jfilePaths,
k);
const char *rawString = env->GetStringUTFChars(filePath, 0);
LOGV("reading = %s", rawString);
imageBuff[i][j] = imread(rawString, 1);
if(!imageBuff[i][j].data) {
LOGV("failed to read = %s", rawString);
}
env->ReleaseStringUTFChars(filePath, rawString);
k++;
}
}
//Creating a 2 dimensional array from the 2 dimensional array
/*for (int i = 0; i < rows; i++)
{
jstringArray filePath = (jstringArray) env->GetObjectArrayElement(
jfilePaths, i);
for (int j = 0; j < columns; j++)
{
const char *rawString = env->GetStringUTFChars(filePath, j);
LOGV("reading = %s", rawString);
imageBuff[i][j] = imread(rawString, 1);
if(!imageBuff[i][j].data) {
LOGV("failed to read = %s", rawString);
}
env->ReleaseStringUTFChars(filePath, rawString);
}
}*/
答案 0 :(得分:2)
假设jfilePaths
是在Java中用String[][]
声明的二维字符串数组:
2D数组只是一个对象数组,其中每个元素本身就是一个对象数组,每行一个。因此,您可以通过获取2D数组的长度来查找行计数,通过获取第一个对象(将是包含第一行字符串的对象数组)并获取其长度来查找列数。
int rows = env->GetArrayLength(jfilePaths);
jobjectArray firstRow = (jobjectArray)(env->GetObjectArrayElement(jfilePaths, 0));
int columns = env->GetArrayLength(firstRow);
然后你可以像这样遍历行和列:
for(i = 0; i < rows; i++)
{
jobjectArray currentRow = (jobjectArray)((env->GetObjectArrayElement(jfilePaths, i));
for(j = 0; j < columns; j++)
{
jstring filePath = (jstring)((env->GetObjectArrayElement(currentRow, j));
const char *rawString = env->GetStringUTFChars(filePath, 0);
// do stuff...
}
}