I have tested it on Galaxy S and it worked well on Galaxy S (2.2). I have not tried it on another Nexus One in order to know if my Nexus One is faulty.
and it seems like that AssetFileDescriptor is not the source of the problem, because the problem is still ocurring while I didn't access asset files directly but accessing copied ones. On Fri, Feb 25, 2011 at 1:10 PM, Dewr <wind8...@gmail.com> wrote: > it often causes SIGSEGV on third for-loop. but just a moment ago SIGSEGV on > fourth loop. > >> for ( i = 0 ; i < 4 ; i++ ) { >> sprintf (temp, "%s%s", header[i], index[fileno[i]]); >> *strBuf = getTextByIndex(&filebuf, temp);* *//malloc() in this >> function.* >> if (strBuf == NULL) >> buf_output[i] = NULL; >> else >> >> { >> buf_output[i] = (*gEnv)->NewStringUTF(gEnv, strBuf); >> * free(strBuf);* >> } >> } >> > > On Thu, Feb 24, 2011 at 1:15 PM, Dewr <wind8...@gmail.com> wrote: > >> Hello, I am porting a C program. >> >> The problem I've met is SIGSEGV on free(). I can't see what's the root >> cause of it. >> it doesn't occur sometimes, but very often. >> >> I am testing it on NexusOne 2.2.1 >> I am using Android NDK r5b and Android SDK and Eclipse ADT and Cygwin. >> >> I am using *android.content.res.AssetFileDescriptor* to read assets in C >> modules. >> >> Here is the messages in ndk-gdb when the problem appears. >> >>> (gdb) c >>> Continuing. >>> >>> Breakpoint 2, Java_kr_co_pkbio_Unse_DangSaJuShinSal (env=0xaa50, >>> obj=0x4495b970) >>> at >>> C:/DEWR/Product/Software-Engineering/Eclipse-Workspace/Unse/jni/unse.c:1 >>> 83 >>> *1083 free(strBuf);* >>> (gdb) next >>> >>> *Program received signal SIGSEGV, Segmentation fault.* >>> *0xafd11c80 in __libc_android_abort ()* >>> from >>> C:/DEWR/Product/Software-Engineering/Eclipse-Workspace/Unse/obj/local/a >>> meabi/libc.so >>> (gdb) bt >>> #0 0xafd11c80 in __libc_android_abort () >>> from >>> C:/DEWR/Product/Software-Engineering/Eclipse-Workspace/Unse/obj/local/a >>> meabi/libc.so >>> #1 0xbec233bc in ?? () >>> Cannot access memory at address 0xc >>> (gdb) quit >>> >> >> Here is the Java source code... >> >>> public static FileInfoForNativeCode openAssets(String fname) { >>> if (Constants.VERBOSE_LOGS) >>> Log.d(TAG, "openAssets("+fname+")"); >>> >>> *AssetFileDescriptor myDescriptor = null;* >>> try { >>> myDescriptor = context.getAssets().openFd(fname+".jet"); >>> } catch (IOException e) { >>> e.printStackTrace(); >>> return null; >>> } >>> FileDescriptor fd = myDescriptor.getFileDescriptor(); >>> long off = myDescriptor.getStartOffset(); >>> long len = myDescriptor.getLength(); >>> >>> if (Constants.VERBOSE_LOGS) >>> Log.d(TAG, "fd:"+fd+" off:"+off+" len:"+len); >>> >>> return new FileInfoForNativeCode(off, len, fd); >>> } >>> >> >> Here is the C source code... >> >>> char* getTextByIndex (TextFileBufType *filebuf, char *index) { >>> #define _INDEX_PREFIX_ '@' >>> int i, j, lenBuf; >>> char *result; >>> char indexPrefix = _INDEX_PREFIX_; >>> int lenIndexPrefix = utf8len( &indexPrefix ); >>> int lenIndex = strlen(index); >>> >>> for ( i = 0 ; i < filebuf->total ; i++ ) { >>> *//__android_log_print(ANDROID_LOG_DEBUG,"TAG", "JNI : %d -> >>> %s", i, filebuf->text[i]);* >>> >>> if ( memcmp (filebuf->text[i], &indexPrefix, lenIndexPrefix) != 0 >>> ) >>> continue; >>> >>> if ( memcmp (filebuf->text[i]+lenIndexPrefix, index, lenIndex) != >>> 0 ) >>> continue; >>> >>> lenBuf = 0; >>> lenBuf += strlen(filebuf->text[i]); >>> lenBuf++; >>> for ( j = i+1 ; j < filebuf->total ; j++ ) { >>> if ( memcmp (filebuf->text[j], &indexPrefix, lenIndexPrefix) >>> == 0 ) >>> break; >>> >>> lenBuf += strlen(filebuf->text[j]); >>> lenBuf++; >>> } >>> >>> *result = malloc(lenBuf);* >>> result[0] = 0; >>> strcat(result, filebuf->text[i]); >>> strcat(result, "\n"); >>> for ( j = i+1 ; j < filebuf->total ; j++ ) { >>> if ( memcmp (filebuf->text[j], &indexPrefix, lenIndexPrefix) >>> == 0 ) >>> break; >>> >>> strcat(result, filebuf->text[j]); >>> strcat(result, "\n"); >>> } >>> >>> *//__android_log_print(ANDROID_LOG_DEBUG,"TAG", "JNI : %d!!! -> >>> %s", i, filebuf->text[i]);* >>> *return result;* >>> } >>> >>> return NULL; >>> >>> #undef _INDEX_PREFIX_ >>> } >>> >>> inline void readyFileInFile (FileInFile *fif, char *path) >>> { >>> jstring jstrFpath; >>> jobject finfo; >>> jobject descriptor; >>> >>> jstrFpath = (*gEnv)->NewStringUTF(gEnv, path); >>> finfo = (*gEnv)->CallStaticObjectMethod(gEnv, clsUtility, >>> midOpenAssets, jstrFpath); >>> fif->offset = (*gEnv)->GetLongField(gEnv, finfo, fidOffset); >>> fif->length = (*gEnv)->GetLongField(gEnv, finfo, fidLength); >>> descriptor = (*gEnv)->GetObjectField(gEnv, finfo, fidDescriptor); >>> fif->fd = (*gEnv)->GetIntField(gEnv, descriptor, >>> fidDescriptorFileDescriptor); >>> } >>> >>> jobjectArray Java_kr_co_pkbio_Unse_DangSaJuShinSal (JNIEnv *env, jobject >>> obj) { >>> *// char *fname = "DangSaJu_ShinSal";* >>> int i, fileno[4], ret_code, type; >>> char temp[256]; >>> char *header[4] = { "년", "월", "일", "시" }; >>> char table1[12] = { 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2 }; >>> char table2[4] = {10, 7, 4, 1}; >>> >>> char *index[12] = { >>> "겁살", "재살", "천살", "지살", "연살", "월살", >>> "망신살", "장성살", "반안살", "역마살", "육해살", "화개살" >>> }; >>> >>> int r_option; >>> int numBytesRead; >>> char *strBuf; >>> TextFileBufType filebuf; >>> jstring buf_output[4]; >>> jobjectArray output; >>> FileInFile fif; >>> >>> gEnv = env; >>> >>> */* 년월일시에 대한 겁살을 계산한다 */* >>> type = table1[BaseInfo.saju.day % 12]; >>> fileno[0] = (table2[type] + (BaseInfo.saju.year % 12)) % 12; >>> fileno[1] = (table2[type] + (BaseInfo.saju.month % 12)) % 12; >>> fileno[2] = (table2[type] + (BaseInfo.saju.day % 12)) % 12; >>> fileno[3] = (table2[type] + (BaseInfo.saju.hour % 12)) % 12; >>> */*WriteMsg (" - 기본위치 : 생일지지(%s) --> type:%d --> 자(%s)에 대한 살:%s\n", >>> JeeJeeStr[BaseInfo.saju.day % 12], type, JeeJeeStr[0], >>> index[table2[type]]); >>> WriteMsg (" - 년살 : 생년지지(%s) --> 년%s\n", >>> JeeJeeStr[BaseInfo.saju.year % 12], >>> index[fileno[0]]); >>> WriteMsg (" - 월살 : 생월지지(%s) --> 월%s\n", >>> JeeJeeStr[BaseInfo.saju.month % 12], >>> index[fileno[1]]); >>> WriteMsg (" - 일살 : 생일지지(%s) --> 일%s\n", >>> JeeJeeStr[BaseInfo.saju.day % 12], >>> index[fileno[2]]); >>> WriteMsg (" - 시살 : 생시지지(%s) --> 시%s\n", >>> JeeJeeStr[BaseInfo.saju.hour % 12], >>> index[fileno[3]]);*/* >>> >>> >>> readyFileInFile(&fif, "data/DangSaJu5.dat"); >>> >>> r_option = ((int)'#' << 8) & 0xFF00; /* Comment char setting */ >>> r_option |= (RT_OPT_RMCMT | RT_OPT_RMCRLF | RT_OPT_LTRIM | >>> RT_OPT_RTRIM | RT_OPT_SPACES); >>> >>> if ( ReadTextFileToBufA (&filebuf, &fif, r_option) < 0 ) { >>> __android_log_print(ANDROID_LOG_ERROR,"TAG", "JNI : 서버측에서 치명적인 >>> 오류가 발생하여 더이상 진행할 수 없습니다."); >>> return NULL; >>> } >>> >>> for ( i = 0 ; i < 4 ; i++ ) { >>> sprintf (temp, "%s%s", header[i], index[fileno[i]]); >>> *strBuf = getTextByIndex(&filebuf, temp);* >>> *//__android_log_print(ANDROID_LOG_DEBUG,"TAG", "JNI : %s -> >>> %s", temp, strBuf );* >>> buf_output[i] = (*gEnv)->NewStringUTF(gEnv, strBuf); >>> * free(strBuf); //line number : 1083 ***It doesn't cause SIGSEGV >>> on first for-loop-round, but on third for-round.**** >>> *//PrintTextFile3 ("../data/DangSaJu5.dat", temp, VIEW_T_R_STR, >>> // "12신살로 알아보는 인생의 길흉화복 : %s", temp); >>> /*if (i < 3) { >>> sprintf (temp, "\n 계속해서 %s%s에 대한 풀이를 보시겠습니까? (Y/n)", >>> header[i+1], index[fileno[i+1]]); >>> ret_code = GetYesNo (temp, GETYN_YES); >>> if (ret_code == GETYN_NO) return; >>> }*/* >>> } >>> >>> FreeTextFileBuf (&filebuf); >>> *//printf ("\n [Enter]키를 누르세요."); fflush(stdout); >>> //PauseUntil (300, 0);* >>> *#if defined (_DO_NOT_COMPILE_) >>> { >>> int j; >>> for (i=0 ; i<4 ; i++) { >>> for (j=0 ; j<12 ; j++) { >>> sprintf (temp, "%s%s", header[i], index[j]); >>> ** //PrintTextFile3 ("../data/DangSaJu5.dat", temp, >>> VIEW_T_R_STR, >>> // "당사주 / 인생 길흉화복 datafile test : %s", temp); >>> } >>> } >>> } >>> #endif* >>> >>> output = (*gEnv)->NewObjectArray(gEnv, 4, clsString, NULL); >>> (*gEnv)->SetObjectArrayElement(gEnv, output, 0, buf_output[0]); >>> (*gEnv)->SetObjectArrayElement(gEnv, output, 1, buf_output[1]); >>> (*gEnv)->SetObjectArrayElement(gEnv, output, 2, buf_output[2]); >>> (*gEnv)->SetObjectArrayElement(gEnv, output, 3, buf_output[3]); >>> >>> return output; >>> } >>> >> > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en