Creating large scale string array crashes in NDK

230 views
Skip to first unread message

罡王

unread,
Jan 7, 2010, 2:40:01 AM1/7/10
to andro...@googlegroups.com
Hi all,
I am trying to generate at most 2000-3000 strings in C++, and transfter them to java, but it fails
I tried two method, neither is ok. Below is my test code:
(parameter jstr is not used)
extern "C" jobject
Java_com_example_hellojni_jniinterface_JniInterface_TestData(JNIEnv* env,
                                                  jobject thiz,
                                                  jstring jstr)
{
    jint len = 5;

    jclass objClass = env->FindClass("java/lang/String");
    jobjectArray arr = env->NewObjectArray(len, objClass, 0);

    for (jint i = 0; i < len; ++i)
        env->SetObjectArrayElement(arr, i, env->NewStringUTF("MMSSTTTTTTSSSSSSMM"));

    return arr;
}

extern "C" jboolean
Java_com_example_hellojni_jniinterface_JniInterface_TestData2(JNIEnv* env,
                                                  jobject thiz,
                                                  jstring jstr,
                                                  jobject jobjList)
{
    jsize len = 3000;
    jclass cls = env->GetObjectClass(jobjList);

    {
        jfieldID fid = env->GetFieldID(cls, "mList", "[Ljava/lang/String;");

        jclass objClass = env->FindClass("java/lang/String");
        jobjectArray arr = env->NewObjectArray(len, objClass, 0);

        for (jint i = 0; i < len; ++i)
            env->SetObjectArrayElement(arr, i, env->NewStringUTF("MMSSTTTTTTSSSSSSMM"));

        env->SetObjectField(jobjList, fid, arr);
    }
    return JNI_TRUE;
}

Corresponding to TestData2, in Java, I define
public class MyData
{
public String[] mList;
}



Using pure Java, I can generate string arrays of size 3000, containing the same elements.
Does anybody know why?

Thanks

罡王

unread,
Jan 7, 2010, 3:07:09 AM1/7/10
to andro...@googlegroups.com
It seems it stops after about calling NewStringUTF 500 times
I changed TestData2 functions
The last line in testout3.txt is "503 ok"

extern "C" jboolean
Java_com_example_hellojni_jniinterface_JniInterface_TestGetLines2(JNIEnv* env,
                                                  jobject thiz,
                                                  jstring jstr,
                                                  jobject jobjLineList)
{
    jsize len = 3000;
    jclass cls = env->GetObjectClass(jobjLineList);

    {
        FILE *fp = fopen("/sdcard/testout3.txt", "w");

        jfieldID fid = env->GetFieldID(cls, "mLineList", "[Ljava/lang/String;");


        jclass objClass = env->FindClass("java/lang/String");
        jobjectArray arr = env->NewObjectArray(len, objClass, 0);

        jstring *sarr = new jstring[len];


        for (jint i = 0; i < len; ++i)
        {
            sarr[i] = env->NewStringUTF("MMSSTTTTTTSSSSSSMM");
            fprintf(fp, "%d ok\n", i);
        }

        fprintf(fp, "Create Success\n");


        for (jint i = 0; i < len; ++i)
            env->SetObjectArrayElement(arr, i, sarr[i]);

        fprintf(fp, "Set data success\n");

        env->SetObjectField(jobjLineList, fid, arr);

        delete[] sarr;
        fclose(fp);
    }
    return JNI_TRUE;
}

2010/1/7 wg <wgn...@gmail.com>

罡王

unread,
Jan 7, 2010, 3:54:04 AM1/7/10
to andro...@googlegroups.com
I merge all the strings to a large string, separated with some characters, it works fine

2010/1/7 wg <wgn...@gmail.com>
Reply all
Reply to author
Forward
0 new messages