2011-09-11 3 views
2

J'ai un cas de test où Java appelle une routine simple en C avec un couple d'args et il renvoie une chaîne et cela fonctionne. Cependant, lorsque j'ai codé mon code réel de la même manière, il se bloque avec une "Exception de cible d'invocation". Je l'ai ensuite simplifié à juste un appel et le retour d'une chaîne et il se bloque toujours. Une différence entre les deux cas est que l'un des appels a 6 arguments en virgule flottante, et l'autre 14 ars flottants. Le 6-arg est appelé en premier (une configuration) et je reçois l'exception.Crash Android natif de code

Existe-t-il une limitation pratique sur le nombre d'arguments qui peuvent être dans un appel au code natif? Ou devrais-je continuer à regarder mon code pour le problème ailleurs?

Désolé - Je n'ai pas pu convertir le logcat en commentaire, je le publie donc en tant que modification. Voici le logcat, toute suggestion où je devrais regarder? Que signifie "Aucune implémentation trouvée"?

D/dalvikvm( 531): Added shared lib /data/data/com.kinyur.etold/lib/libgalib.so 0x405133e0 
D/dalvikvm( 531): No JNI_OnLoad found in /data/data/com.kinyur.etold/lib/libgalib.so 0x405133e0, skipping init 
W/dalvikvm( 531): No implementation found for native Lcom/kinyur/etold/NativeLib;.setup (FFFFFF)Ljava/lang/String; 
D/AndroidRuntime( 531): Shutting down VM 
W/dalvikvm( 531): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
E/AndroidRuntime( 531): FATAL EXCEPTION: main 

La routine est appelée avec 6 flottants et renvoie un type de chaîne. Et le "setup" est le nom de la routine que j'ai appelé quand il s'est écrasé.

+0

Pourriez-vous poster votre prototype de fonction native, le prototype java correspondant, et une invocation exemple où il échoue? Les entrées de logcat pertinentes seraient également utiles. – JesusFreke

+1

14 arguments @ _ @ refactor? – Xorlev

+0

Merci de m'avoir assuré que le problème n'est pas les limitations d'arg. Je vais y passer une autre journée avant de crier pour plus d'aide - si je peux le trouver, ça vous fera gagner du temps. J'ai couru logcat et vu cela, peut-être que vous pourriez me donner un pointeur où chercher? –

Répondre

1

Désolé pour la distraction, j'ai passé toute la journée à ce sujet et constaté que le problème était juste une faute de frappe stupide de ma part, probablement un problème de copier-coller. Il est intéressant aussi de savoir que j'avais protégé l'appel natif avec un bloc try ... catch, mais le programme est toujours tombé en panne au lieu d'avoir une exception.

J'ai eu deux problèmes. La première primaire était:

Le nom décoré de la routine dans mon fichier .C était faux. Dans mon cas de test qui a travaillé, j'utilisais:

JNIEXPORT jstring JNICALL Java_com_example_atest_NativeLib_hello 

et dans mon cas réel que je voulais:

JNIEXPORT jstring JNICALL Java_com_kinyur_etold_NativeLib_doSetup 

mais ce que j'avais été:

JNIEXPORT jstring JNICALL Java_com_example_atest_NativeLib_doSetup 

donc je devais cruft Je suis parti de quand j'ai copié le cas qui a fonctionné dans le nouveau. Je ne sais pas combien de fois je l'ai regardé aujourd'hui et je ne l'ai pas remarqué. :-(

Et il est intéressant, selon logcat, il semblait faire un lien vers la bibliothèque OK et a échoué quand il a couru (en utilisant le nom de routine « bonjour » au lieu de « DOSETUP »):

D/dalvikvm( 460): Trying to load lib /data/data/com.kinyur.etold/lib/libgalib.so 0x40515840 
D/dalvikvm( 460): Added shared lib /data/data/com.kinyur.etold/lib/libgalib.so0x40515840 
D/dalvikvm( 460): No JNI_OnLoad found in /data/data/com.kinyur.etold/lib/libgalib.so 0x40515840, skipping init 
W/dalvikvm( 460): No implementation found for native Lcom/kinyur/etold/NativeLib;.hello()Ljava/lang/String; 
D/AndroidRuntime( 460): Shutting down VM 
W/dalvikvm( 460): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
E/AndroidRuntime( 460): FATAL EXCEPTION: main 
E/AndroidRuntime( 460): java.lang.UnsatisfiedLinkError: hello 
E/AndroidRuntime( 460):  at com.kinyur.etold.NativeLib.hello(Native Method) 
E/AndroidRuntime( 460):  at com.kinyur.etold.ComFields.<init>(ComFields.java:33) 
E/AndroidRuntime( 460):  at com.kinyur.etold.EtMain.onCreate(EtMain.java:28) 
E/AndroidRuntime( 460):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 

Le deuxième problème que j'ai trouvé en cherchant le premier était que je retournais incorrectement une chaîne dans la routine C.

J'ai eu:

char* aString = "1234"; 
return aString; 

Ce qui était nécessaire était:

return (*env)->NewStringUTF(env, aString); 
2

Je ne suis pas au courant des limitations du nombre d'arguments d'une méthode JNI