2012-05-14 6 views
6

Tratando de averiguar por qué la llamada a la función C++ que devuelve un int bloquea la aplicación completa sin ningún error/advertencia.Devolviendo una int de la función nativa (C++, jni) bloquea la aplicación

Aquí está trabajando código:


    jint Java_org_ntorrent_DummyTorrentInfoProvider_next(
      JNIEnv * env, jobject obj, jint number) 
    { 
     jint test = rand(); 
     __android_log_print(ANDROID_LOG_DEBUG, "HelloNDK!", "rand() = %d", test); 

     return number; 
    } 

Y este código de aplicación se bloquea sin advertencias:


    jint Java_org_ntorrent_DummyTorrentInfoProvider_next(
      JNIEnv * env, jobject obj, jint number) 
    { 
     jint test = rand(); 
     __android_log_print(ANDROID_LOG_DEBUG, "HelloNDK!", "rand() = %d", test); 

     return number + test; 
    } 

Antes de la aplicación se bloquea puedo ver mi mensaje de registro (__ android_log_print) en el gato registro

EDITAR: Incluso si reemplazo "número + prueba" con "1", la aplicación sigue bloqueándose ... Solo funciona ks si vuelvo "número" ...

editar # 2: el código del lado de Java:


package org.ntorrent; 

import java.util.ArrayList; 
import java.util.Random; 

public class DummyTorrentInfoProvider implements TorrentInfoProvider { 

    public native Integer next(Integer number); 

    //public Integer next() { return _random.nextInt(); } 

    public native void test(); 

    private Random _random = new Random(100); 

    @Override 
    public ArrayList getTorrents() { 
     test(); 
     ArrayList torrents = new ArrayList(); 
     torrents.add(
       new TorrentInfo("test torrent number 1", next(1), 3f, 5f)); 
     torrents.add(
       new TorrentInfo("test torrent number 2", next(2), 4f, 15f)); 
     torrents.add(
       new TorrentInfo("test torrent number 555")); 
     torrents.add(
       new TorrentInfo("test torrent number 3", next(3), 13f, 5f)); 
     return torrents; 
    } 

    static { 
     System.loadLibrary("test"); 
    } 
} 
+0

pila smash, u otro tipo de problemas de memoria? –

+0

Obtenga un volcado de la JVM y vea qué está pasando exactamente. En Hotspot hay opciones para depurar estos problemas, sin embargo, no hay ninguna idea acerca de Android. El código aquí está bien, el problema está en otra parte. – Voo

+0

Gracias por respuestas rápidas, chicos! Lo intentaré mañana ... – 6opuc

Respuesta

13
jint Java_org_ntorrent_DummyTorrentInfoProvider_next(
    JNIEnv * env, jobject obj, jint number) 

y

public native Integer next(Integer number); 

no se correspondan. Un entero es un objeto, mientras que int es una primitiva.

Si su código nativo utiliza jint, el código Java debe utilizar int en la declaración del método nativo.

(Si desea pasar un Entero, tendrá que tratarlo como un trabajo en el lado nativo, y pasar por aros para acceder a él - probablemente sea más fácil usar int/jint y hacer cualquier conversión necesaria a de entero en el lado java)

+0

Gah, me ganaste por unos segundos. ¡Bien hecho! –

+0

¡Muchas gracias! Sería mejor para mí si primero leo la documentación;) Lo intentaré hoy – 6opuc

+0

¡Cambié el número entero a int y funciona ahora! ¡Gracias! – 6opuc

Cuestiones relacionadas