Проблема JNI: передача исполняемого объекта Java в JNI в пользовательском плагине Gluon AttachJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Проблема JNI: передача исполняемого объекта Java в JNI в пользовательском плагине Gluon Attach

Сообщение Anonymous »

Я разрабатываю пользовательский плагин Gluon Attach и столкнулся с проблемами при передаче объекта Java Runnable из Java в JNI. Несмотря на просмотр исходного кода плагина Gluon Attach (который, к сожалению, в данном случае не очень помог), мне не удалось успешно вызвать объект Runnable на собственной стороне.
Контекст
Это специальная реализация AndroidAlertDialogService в специальном плагине Gluon Attach. Я хочу передать объект Runnable в качестве последнего параметра собственного метода showSaveAlert3.
Когда собственный код пытается вызвать Runnable, Я постоянно сталкиваюсь с этой ошибкой:

Код: Выделить всё

JNI DETECTED ERROR IN APPLICATION: JNI ERROR (app bug):
jobject is an invalid JNI transition frame reference: 0x8000000000000008
Обзор кода

Java Class 1 (AndroidAlertDialogService)

Обзор кода

Java Class 1 (AndroidAlertDialogService)

Код: Выделить всё

package com.gluonhq.attachextended.alertdialog.impl;

import com.gluonhq.attachextended.alertdialog.AlertDialogService;

public class AndroidAlertDialogService implements AlertDialogService {

static {
System.loadLibrary("alertdialog");
}

@Override
public void showSaveAlert(String title, String content, Runnable r) {
showSaveAlert3(title, content, r);
}

private native static void showSaveAlert3(String title, String content, Runnable r);
}

Код JNI (alertdialog.c)[/b]

Код: Выделить всё

#include "util.h"

static jclass jAlertDialogServiceClass;
static jobject jDalvikAlertDialogService;

static jmethodID jAlertDialogServiceShowSaveAlert3Method;

static void initializeAlertDialogDalvikHandles() {
jAlertDialogServiceClass = GET_REGISTER_DALVIK_CLASS(jAlertDialogServiceClass, "com/gluonhq/helloandroid/DalvikAlertDialogService");

ATTACH_DALVIK();
jmethodID jAlertDialogServiceInitMethod = (*dalvikEnv)->GetMethodID(dalvikEnv, jAlertDialogServiceClass, "", "(Landroid/app/Activity;)V");

jAlertDialogServiceShowSaveAlert3Method = (*dalvikEnv)->GetMethodID(dalvikEnv, jAlertDialogServiceClass, "showSaveAlert3", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Runnable;)V");

jobject jActivity = substrateGetActivity();
jobject jObj = (*dalvikEnv)->NewObject(dalvikEnv, jAlertDialogServiceClass, jAlertDialogServiceInitMethod, jActivity);
jDalvikAlertDialogService = (*dalvikEnv)->NewGlobalRef(dalvikEnv, jObj);
DETACH_DALVIK();
}

//////////////////////////
// From Graal to native //
//////////////////////////

JNIEXPORT jint JNICALL
JNI_OnLoad_alertdialog(JavaVM *vm, void *reserved)
{
JNIEnv* graalEnv;
ATTACH_LOG_INFO("JNI_OnLoad_alertdialog called");
#ifdef JNI_VERSION_1_8
if ((*vm)->GetEnv(vm, (void **)&graalEnv, JNI_VERSION_1_8) != JNI_OK) {
ATTACH_LOG_WARNING("Error initializing native AlertDialog from OnLoad");
return JNI_FALSE;
}
ATTACH_LOG_FINE("[AlertDialog Service] Initializing native AlertDialog from OnLoad");
initializeAlertDialogDalvikHandles();
return JNI_VERSION_1_8;
#else
#error Error: Java 8+ SDK is required to compile Attach
#endif
}

// from Java to Android

JNIEXPORT void JNICALL Java_com_gluonhq_attachextended_alertdialog_impl_AndroidAlertDialogService_showSaveAlert3
(JNIEnv *env, jclass jClass, jstring jtitle, jstring jcontent, jobject jr) {
const char *titleChars = (*env)->GetStringUTFChars(env, jtitle, NULL);
const char *contentChars = (*env)->GetStringUTFChars(env, jcontent, NULL);

ATTACH_DALVIK();
jstring jTitleString = (*dalvikEnv)->NewStringUTF(dalvikEnv, titleChars);
jstring jContentString = (*dalvikEnv)->NewStringUTF(dalvikEnv, contentChars);

jobject globalRunnable = (*dalvikEnv)->NewGlobalRef(dalvikEnv, jr);
jclass rClass = (*dalvikEnv)->GetObjectClass(dalvikEnv, globalRunnable);

jmethodID midMyCustomMethod = (*dalvikEnv)->GetMethodID(dalvikEnv, rClass, "run", "()V");
(*dalvikEnv)->CallVoidMethod(dalvikEnv, jDalvikAlertDialogService, jAlertDialogServiceShowSaveAlert3Method, jTitleString, jContentString, midMyCustomMethod);

DETACH_DALVIK();
(*env)->ReleaseStringUTFChars(env, jtitle, titleChars);
(*env)->ReleaseStringUTFChars(env, jcontent, contentChars);
}

Java Class 2 (DalvikAlertDialogService)

Код: Выделить всё

package com.gluonhq.helloandroid;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.app.Activity;

public class DalvikAlertDialogService {

private final Activity activity;

public DalvikAlertDialogService(Activity activity) {
this.activity = activity;
}

public void showSaveAlert3(String title, String content, Runnable r) {
activity.runOnUiThread(() -> {
if (!activity.isFinishing()) {
AlertDialog.Builder dialog = new AlertDialog.Builder(activity);
dialog.setCancelable(false);
dialog.setTitle(title);
dialog.setMessage(content);
dialog.setPositiveButton("Ok", (DialogInterface dialog1, int id) -> {
dialog1.dismiss();
r.run();
});

AlertDialog alert = dialog.create();
alert.show();
}
});
}
}
Что я пробовал
  • Использование NewGlobalRef для создания постоянной ссылки на объект Runnable перед вызовом его метода run.
  • Проверка достоверности среды Dalvik (

    Код: Выделить всё

    dalvikEnv
    ).
  • Изучение исходного кода Gluon Attach для существующих плагинов, таких как "DisplayService" и "StorageService". К сожалению, эти примеры в основном ориентированы на передачу строк, примитивов или массивов, а не на сложные объекты Java, такие как Runnable.
Постановка проблемы
Несмотря на эти попытки, мне не удалось вызвать метод run() Runnable. Ссылка на jobject кажется недействительной при использовании в контексте JNI, что приводит к упомянутой выше ошибке.

Вопросы
  • Как правильно передать объект Java Runnable в JNI и вызвать его run() метод в этом контексте?
  • Есть ли какие-либо конкретные шаги для обработки Запускаемые объекты в Gluon Attach, которые мне могут не хватать?
  • Может ли проблема быть связана с неправильным управлением ссылками (

    Код: Выделить всё

    NewGlobalRef
    , Detach и т. д.) в среде Dalvik?


Подробнее здесь: https://stackoverflow.com/questions/792 ... ach-plugin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»