JNI可能是一個真正的頭痛。你的表面看起來很好看。
首先,我注意到你沒有使用offset
- 這是一種代碼味道。
其次,你沒有釋放UChar陣列。
第三,C函數或賦值循環可能會溢出數組邊界。
爲了幫助定位突然崩潰這樣的,我已經成功地與控制檯一起使用的好醇派print
聲明。
首先我添加一個println方法我JNIGlobal類:
/** Print text or ASCII byte array prefixed with "JNI: ". Primarily for native code to output to the Java console. */
static public void println(Object val) {
if(val instanceof byte[]) { byte[] ba=(byte[])val; val=new String(ba,0,ba.length); }
System.out.println("JNI: "+val);
}
然後,我添加一個對應方法我的C代碼:
void println(JNIEnv *jep, byte *format,...) {
va_list vap;
byte txt[5001];
jsize txtlen;
jclass eCls;
jint mId;
jbyteArray jText;
va_start(vap,format); vsprintf(txt,format,vap); va_end(vap);
txtlen=(long)strlen(txt);
if((eCls=(*jep)->FindClass(jep,"<your/package/here/JNIGlobal"))==0) {
printf("JNI: Global class not found (Error Text: %s)\n",txt);
return; /* give up */
}
if((mId=(*jep)->GetStaticMethodID(jep,eCls,"println","(Ljava/lang/Object;)V"))==0) {
printf("JNI: Global println method not found (Error Text: %s)\n",txt);
return; /* give up */
}
jText=(*jep)->NewByteArray(jep,txtlen);
(*jep)->SetByteArrayRegion(jep,jText,0,txtlen,(void*)txt);
(*jep)->CallStaticVoidMethod(jep,eCls,mId,jText);
}
然後我打電話println(env,"Some formatted output")
在每一行來源看它有多遠。在我的環境(一個AS/400)中,當JVM在交互式運行期間崩潰時,我只剩下控制檯 - 您可能希望在Java代碼中添加一小段延遲,以確保在控制檯消失之前看到輸出。
因此,對於你,就像這樣:
static jint testFunction(JNIEnv* env, jclass c, jobject obj,
jcharArray chsArray, int offset, int len, jcharArray dstArray) {
/**/println("** testFunction 1");
jchar* dst = env->GetCharArrayElements(dstArray, NULL);
/**/println("** testFunction 2");
if (dst != NULL) {
/**/println("** testFunction 3");
UChar *str = new UChar[len];
/**/println("** testFunction 4");
//populate str here from an ICU4C function
/**/println("** testFunction 5");
for (int i=0; i<len; i++)
dst[i] = str[i]; //this might be the problematic piece of code (can I issue an assignment like this?)
}
/**/println("** testFunction 6");
}
env->ReleaseCharArrayElements(dstArray, dst, 0);
/**/println("** testFunction 7");
}
您已經嘗試了調試器附加到正在運行的Java程序調用JNI代碼,把一個斷點在第一行,並通過它一步? – 2011-02-15 20:40:27