En retournant un int de fonction native(c++, jni) se bloque application
À essayer de comprendre pourquoi c++ appel de fonction retournant un int bloque l'ensemble de l'application, sans les erreurs/avertissements.
Voici code du travail:
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;
}
Et ce code se bloque application sans mise en garde:
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;
}
Avant l'application se bloque, je peux voir mon message du journal(__android_log_d'impression) dans le journal de chat
EDIT:
Même si je remplace le "nombre + test" par "1", l'application plante toujours...
Il ne fonctionne que si je retourne "nombre"...
EDIT#2: Java-code:
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");
}
}
- pile smash, ou d'autres types de troubles de la mémoire?
- Faire un dump de la JVM et regardez ce qui se passe exactement. En vertu de Hotspot il y a des options de debug ces problèmes - aucune idée sur android bien. Le code ici est très bien, le problème est ailleurs.
- Merci pour les réponses rapides, les gars! Je vais essayer ça demain...
- Ces erreurs sera possible que si j'utilise une version incorrecte de ndk-têtes?
- juste de la curiosité ce qui se passe si vous ne
test += number; return test
; - il se bloque toujours
- J'ai mis à jour la question avec le code java
- Qui semble bien pour moi. Je ne peux pas trouver à redire.
Vous devez vous connecter pour publier un commentaire.
et
Ne correspondent pas. Un Entier est un Objet, alors qu'un int est une primitive.
Si votre code natif utilise jint, votre code java doit utiliser int dans la déclaration de la méthode native.
(Si vous souhaitez passer un nombre Entier, vous aurez besoin de la traiter comme une jobject sur le natif de côté, et de sauter à travers des cerceaux d'accès - il est probablement plus facile à utiliser int/jint et faire tout le nécessaire de conversion à partir d'un Entier dans la java côté)