Android вызывает функцию Java из другого класса активности в коде C ++ JNI - PullRequest
0 голосов
/ 18 сентября 2018

Как видно из заголовка, Как я могу вызвать функцию Java из C++, если функция из другого класса активности Java?

Все примеры и учебники вызывают C++ функцию и java туда и обратно, но вызывающим является класс, а JNIEnv и jobject передаются из java через JNI. Но что, если функция, которую нужно было вызвать, принадлежит другому классу активности Java? Как это сделать? прохождение «этого» действия не сработало

Вот примерный макет классов

Занятие

public class MainActivity extends Activity {
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);

          JNIAdapter.launch(); 
      }

      private void DisplayLoginDialog() 
      {
          //...
      }
}

JNIAdapter.class

public class JNIAdapter {
    static {
       System.loadLibrary("jnisample-lib");
    }

     public static native void launch();
}

jnisample.cpp

extern "C"
JNIEXPORT void JNICALL
Java_com_JNIAdapter_launch(JNIEnv *env,jobject object)
{
       jclass dataClass = env->FindClass("com/game/ramo/MainActivity");
       jmethodID javaMethodRef = env->GetMethodID(dataClass, "DisplayLoginDialog", "()V");
       env->CallVoidMethod(object, javaMethodRef);
}

В приведенном выше коде, используя jobject, ссылается на класс JNIAdapter, а не на Activity, следовательно, DisplayLoginDialog () не вызывается. Как это сделать?

1 Ответ

0 голосов
/ 18 сентября 2018

Ваш небольшой пример (я понимаю, что вы сократили все детали, не относящиеся к конкретной проблеме, это очень хорошо!) Может работать без native метода. JNIAdaptor.launch () может быть чистой Java. Итак, для начала перепишите его на Java и убедитесь, что он работает.

Проблемы могут заключаться в том, что MainActivity.DisplayLoginDialog () может ожидать, что его родительская активность находится на переднем плане или в каком-то определенном состоянии. Это легче исправить в чистой Java.

После этого написанный вами код JNI должен работать без проблем.

...