Вызов нестатического метода на Android из JNI

#android #java-native-interface #android-ndk

#Android #java-native-interface #android-ndk

Вопрос:

Я хочу вызвать нестатический метод на Android с помощью JNI. Я могу вызывать статические методы с помощью CallStaticVoidMethod . Для вызова нестатических методов я использовал CallVoidMethod . Он не работает.

Может кто-нибудь, пожалуйста, скажите мне правильный код для вызова нестатического метода Android из JNI?

 jmethodID method = env->GetMethodID(gJniRefCached.ImsFwkLoaderClass, "DispVideo", "([BII)V");
  

env-> CallVoidMethod(gJniRefCached.ImsFwkLoaderClass, метод, arr, ширина, высота);

Я также пытался использовать объект класса, код которого jclass cls = env->GetObjectClass(obj);
jmethodID method = env->GetMethodID(cls, "DispVideo", "([BII)V");
env->CallVoidMethod(cls, method,arr,width,height);

Комментарии:

1. Вы должны рассказать нам немного больше о том, что вы сделали. Покажите нам код, который не работает.

2. Я вставил код .. теперь, пожалуйста, помогите мне…

3. Какова сигнатура метода метода, который вы пытаетесь вызвать? Возвращает ли он значение?

4. нет, он ничего не возвращает, он просто передает массив байтов, т.Е. arr и int width и int height изображения, в функцию Android.

Ответ №1:

Чтобы вызвать метод экземпляра, вам необходимо предоставить экземпляр класса, к которому относится метод, представленный как jobject . Однако в обоих примерах вы пытаетесь вызвать метод экземпляра с экземпляром определения класса, представленного как jclass .

Попробуйте следующее:

 jclass cls = env->GetObjectClass(obj);
jmethodID method = env->GetMethodID(cls, "DispVideo", "([BII)V");
env->CallVoidMethod(obj, method, arr, width, height);
  

Обратите внимание на тонкую разницу в третьей строке кода, где я использую obj в качестве первого параметра вместо cls .

Вы можете увидеть это различие также на странице документации для функций экземпляра метода JNI: http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html#wp16656

Посмотрите на оба GetMethodID и Call<type>Method — один берет jclass , другой берет jobject .