2015-05-21 12 views
5

Ho ricevuto un errore quando eseguo app Android che utilizzo le funzioni JNI e il codice C++ in esso. Quando è eseguito, ho ricevuto qui di seguito un messaggio:Viene visualizzato un messaggio di errore quando si esegue l'app Android JNI A/libc: Segnale fatale 11 (SIGSEGV) a 0xdeadd00d (codice = 1), thread 17729

segnale Fatal 11 (SIGSEGV) a 0xe480001d (codice = 1), filo 5465

E infine ecco i miei codici:

JNIEXPORT jstring JNICALL Java_ir_bassir_ndktest4_MainActivity_getName 
(JNIEnv *env, jobject obj){ 

    jclass cls = (*env)->GetObjectClass(env, obj); 
    jmethodID mid = (*env)->GetStaticMethodID(env, cls, "testJava", "([Ljava/lang/String)[Ljava/lang/String"); 

    jstring plainText = (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI 2222 "); 
    jstring result = (*env)->CallStaticObjectMethod(env, cls, mid, plainText); 

    return (*env)->NewStringUTF(env, plainText); 
} 

e sul lato Java:

public class MainActivity extends ActionBarActivity { 

    public native String getName(); 

    public static String testJava(String txt){ 
     Log.d("BP","call back to java method"); 
     String result = txt + "its added in JAVA"; 
     return result; 
    } 

    static{ 
     System.loadLibrary("HelloJNI"); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     String name = getName(); 

     Log.d("BP",name); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

risposta

3

il lato JNI di questo codice è C, C++ non è, e la manipolazione lassi di C di poi la punzatura è parte del problema. Il tuo codice rompe su queste due linee:

jstring plainText = (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI 2222 "); 
return (*env)->NewStringUTF(env, plainText); 

perché NewStringUTF ha la firma

jstring NewStringUTF(JNIEnv *env, const char *bytes); 

Il che significa che questa chiamata è rotto:

//      vvvvvvvvv--- plainText is not of the right type! 
(*env)->NewStringUTF(env, plainText) 

Il compilatore C lo accetta perché jstring è un tipo di puntatore (non un compilatore C++), quindi plainText verrà interpretato come char const *, che procede a fare cose stupide.

In ogni caso, ho il sospetto che Lei abbia voluto dire

return result; 

... ma se si intende tornare plainText, solo dire

return plainText; 

non c'è bisogno di fare una copia.

+0

con molti ringraziamenti per la vostra risposta Invernomuto. Ma c'era un altro errore nel mio codice che ho corretto e metterlo nella prossima risposta. –

1

C'è corretta mucchio di codice qui:

JNIEXPORT jstring JNICALL Java_ir_bassir_ndktest4_MainActivity_getName (JNIEnv *env, jobject obj) { 
    jclass cls = (*env)->GetObjectClass(env, obj); 
    jmethodID mid = (*env)->GetStaticMethodID(env, cls, "testJava", "(Ljava/lang/String;)Ljava/lang/String;"); 

    jstring plainText = (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI 2222 "); 
    jstring result = (*env)->CallStaticObjectMethod(env, cls, mid, plainText); 
    return result; 
} 
Problemi correlati