2016-08-30 28 views
0

我想用ndk做一些安全問題的工作。Android從線程調用jni方法錯誤(A/libc:致命信號11(SIGSEGV),代碼1,錯誤地址0xdeadbaad在tid 13620(AsyncTask#3))

my ndk code:

jbyte * buff; 
jbyte * result; 

jint buff_size = 0; 
jint result_size = 0; 


jbyte * key = (jbyte *)"HashCode"; 
jint key_size = 9; 

jbyte* ramz(jbyte* s ,jint size_s, jbyte* k, jint size_k) 
{ 
    return s; 
} 

jbyte* dramz(jbyte* s ,jint size_s, jbyte* k, jint size_k) 
{ 
    return s; 
} 


JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_clear(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start of clear\n"); 
    if (buff_size > 0) 
    { 
     delete[] buff; 
    } 
    buff = new jbyte[0]; 
    buff_size = 0; 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "end of clear\n"); 
} 

JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_addChar(JNIEnv * env, jclass obj, jbyte c_int) { 
    jbyte *temp = new jbyte[buff_size+1]; 
    for (int i = 0; i < buff_size; ++i) 
    { 
     temp[i] = buff[i]; 
    } 

    temp[buff_size] = c_int; 
    jbyte * oldbuf = buff; 
    buff = temp; 
    delete[] oldbuf; 
    ++buff_size; 
} 

JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_ramz(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start of ramz\n"); 
    if (result_size > 0) 
    { 
     delete[] result; 
    } 

    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "ramzOOOO\n"); 
    result = ramz(buff, buff_size , key , key_size); 
    result_size = buff_size;// + 7; 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "end of ramz\n"); 
} 

JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_dramz(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start of dramz\n"); 
    if (result_size > 0) 
    { 
     delete[] result; 
    } 

    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "dramzOOOO\n"); 
    result = dramz(buff, buff_size , key , key_size); 
    result_size = buff_size;// - 7; 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "end of dramz\n"); 
} 

JNIEXPORT jint JNICALL Java_com_shabaviz_Server_Server_sizeOf(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start/end of sizeOf\n"); 
    return result_size; 

} 

JNIEXPORT jbyte JNICALL Java_com_shabaviz_Server_Server_getChar(JNIEnv * env, jclass obj, jint c_int) { 
    return result[c_int]; 

} 

my java code structure

com.shabaviz.Server.Server.java

public class Server { 

    static{ 

     System.loadLibrary("hellondk"); 
    } 


    public synchronized static String sendPost(String url , String json) throws Exception { 

     . 
     . 
     . 

     byte [] data = newramz(json.getBytes()); 
     . 
     . 
     . 
     return new String(newdramz(responseFromServer)); 
    } 

    public native static void ramz(); 
    public native static void dramz(); 
    public native static void clear(); 
    public native static void addChar(byte c); 
    public native static int sizeOf(); 
    public native static byte getChar(int index); 


    public synchronized static byte[] newramz(byte[] s) 
    { 
     clear(); 
     for (int i = 0; i < s.length; ++i) 
     { 
      addChar(s[i]); 
     } 
     ramz(); 

     byte[] enc = new byte[sizeOf()]; 

     for (int i = 0; i < enc.length; ++i) 
     { 
      enc[i] = getChar(i); 
     } 
     return enc; 
    } 

    public synchronized static byte[] newdramz(byte[] s) 
    { 
     clear(); 
     for (int i = 0; i < s.length; ++i) 
     { 
      addChar(s[i]); 
     } 
     dramz(); 

     byte[] dec = new byte[sizeOf()]; 

     for (int i = 0; i < dec.length; ++i) 
     { 
      dec[i] = getChar(i); 
     } 

     return dec; 
    } 

MainActivity.java

public class MainActivity extends Activity{ 
    . 
    . 
    . 
    public class Login extends AsyncTask<URL, Integer, Long> { 
     . 
     . 
     . 

     protected Long doInBackground(URL... urls) { 
      response = Server.sendPost(url1 , jsonString1); 
      . 
      . 
      . 
      response2 = Server.sendPost(url2 , jsonString2); 
     } 
    } 
    . 
    . 
    . 
} 

And my problem:

當我android應用程序我看到強制關閉下面的logcat。

08-30 14:46:33.604 15394-15470/com.shabaviz.telegram V/telegramNDK:46:的明確
08-30 14開始33.604 15394-15470/com.shabaviz.telegram V/telegramNDK:清除結束
08-30 14:46:33.604 15394-15470/com.shabaviz.telegram V/telegramNDK:開始ramz
08-30 14:46:33.604 15394-15470/com.shabaviz。電報V /電報NDK:ramzOOOO
08-30 14:46:33.604 15394-15470/com.shabaviz.telegram V/telegramNDK:ramz的結尾
08-30 14:46:33.604 15394-15470/com.shabaviz。電報V /電報NDK:開始/結束大小
08-30 14:46:33.693 15394-15394/com.shabaviz.telegram D/mehdi:oncreatMainActivity
08-30 14:46:33.751 15394-15470/com.shabaviz.telegram V/telegramNDK:開始清除
08-30 14:46:33.751 15394-15470/com.shabaviz.telegram V/telegramNDK:清除結束
08-30 14:46:33.852 15394-15470/com.shabaviz.telegram V/telegramNDK:start dramz
08-30 14:46:33.857 15394-15470/com.shabaviz.telegram V/telegramNDK:dramzOOOO
08-30 14:46:33.857 15394-15470/com.shabaviz.telegram V/telegramNDK:end dramz
08-30 14:46:33.857 15394-15470/com.shabaviz.telegram V/telegramNDK:開始/結束大小
08-30 14:46:33.868 15394-15470/com.shabaviz.telegram V/telegramNDK:開始清除
08-30 14:46:33.868 15394-15470/com.shabaviz.telegram V/telegramNDK:end清除
08-30 14:46:33.869 15394-15470/com.shabaviz.telegram V/telegramNDK:開始ramz
08-30 14:25:31.700 24282-24486/com.shabaviz.telegram A/libc :無效地址或地址損壞的塊0xb9436fa8傳遞給dlfree
08-30 14:25:31.701 24282-24486/com.shabaviz.telegram A/libc:致命信號11(SIGSEGV),代碼1,錯誤地址0xdeadbaad in tid 24486(AsyncTask#3)

我怎樣才能 修理它?

回答

2

考慮當你調用ramz/dramz會發生什麼事,一些字符,然後clear,隨後再次ramz/dramz補充:

在第一次調用設置result = buff,即resultramz/dramzbuff相同的內存塊。並且您將result_size設置爲大於零的值。
當您撥打clear時,buff_size將> 0,因此您將delete[] buff(與result指向的內存相同)。
然後你再次調用ramz/dramz,它會嘗試做delete[] result,但是這個內存已經被釋放了=> OOPS。


作爲一個側面說明,即addChar方法是真的效率低下。您正在爲每個字符進行新分配,並將舊內容複製到新緩衝區,而不是當緩衝區變滿時,將其大小加倍。當然,不是一次一個地傳遞字符,而是一次性傳遞整個byte[]

相關問題