J’ai fait face au problème suivant: je ne peux rien faire avec byte[] (jbyteArray)
dans le code C. Toutes les fonctions qui fonctionnent avec array dans JNI provoquent une JNI DETECTED ERROR IN APPLICATION: jarray argument has non-array type
. Qu’est ce qui ne va pas avec mon code?
C:
#include #include static jssortingng convertToHex(JNIEnv* env, jbyteArray array) { int len = (*env)->GetArrayLength(env, array);// cause an error; return NULL; } static JNINativeMethod methods[] = { {"convertToHex", "([B)Ljava/lang/Ssortingng;", (void*) convertToHex }, }; JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv* env = NULL; if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { return -1; } jclass cls = (*env)->FindClass(env, "com/infomir/stalkertv/server/ServerUtil"); (*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(methods[0]) ); return JNI_VERSION_1_4; }
ServerUtil:
public class ServerUtil { public ServerUtil() { System.loadLibrary("shadow"); } public native Ssortingng convertToHex(byte[] array); }
Activité principale:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ServerUtil serverUtil = new ServerUtil(); byte[] a = new byte[]{1,2,3,4,5}; Ssortingng s = serverUtil.convertToHex(a); } }
Mon environnement:
Merci d’avance!
Le deuxième argument passé à votre fonction n’est pas un jbyteArray
.
Selon la documentation JNI , les arguments transmis à une fonction native sont les suivants:
Arguments de méthode native
Le pointeur d’interface JNI est le premier argument des méthodes natives. Le pointeur d’interface JNI est de type JNIEnv. Le deuxième argument diffère selon que la méthode native est statique ou non statique. Le deuxième argument d’une méthode native non statique est une référence à l’object. Le deuxième argument d’une méthode native statique est une référence à sa classe Java.
Les arguments restants correspondent aux arguments de méthodes Java classiques. L’appel à la méthode native renvoie son résultat à la routine d’appel via la valeur de retour.
Le deuxième argument jclass
ou jobject
votre jssortingng convertToHex(JNIEnv* env, jbyteArray array)
est manquant. Vous devez donc traiter un argument jobject
ou jclass
et un jbyteArray
.
Votre signature de méthode native est incorrecte. CA devrait etre
static jssortingng convertToHe(JNIEnv *env, jobject thiz, jbytearray array)