JNI: impossible d’obtenir la longueur du tableau

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:

  • Android Studio 2.0
  • Module expérimental Gradle 0.7.0
  • JAVA 1.8
  • NDK r11b
  • Windows 10 x64

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)