Как передать объекты C # в метод JNI в Xamarin?

1

Я использую Xamarin и нуждаюсь в вызове до двух статических java-методов в банке, с которой я связан. Вот класс java в банке:

package com.test;

public class Car {
    public static Car makeCar(String name);
    public void drawCar(ImageView imageview);
}

Я не уверен, как передать параметры для двух методов в код JNI. Класс JNIEnv.Call ** Method() принимает массив JValue [] для параметров, я пытаюсь использовать его, чтобы обернуть строку С# и вызвать все так:

// C#

string carName = "mustang";

JValue[] paramCarName = new JValue[] {
    new JValue(JNIEnv.NewString(carName))
};

IntPtr theClass = JNIEnv.FindClass("com.test.Car");
IntPtr theMethod = JNIEnv.GetMethodID(theClass, 
    "makeCar", "()Ljava/lang/String;");
IntPtr resultCar = JNIEnv.CallStaticObjectMethod(
    theClass, theMethod, paramCarName);

Это правильное использование? У меня такая же проблема с вызовом второго метода, который относится к версии С# android ImageView:

// C#

// Xamarin provides an ImageView wrapper class.
ImageView imageview = ...;

// Is it alright to use JNIEnv.ToJniHandle here to reference the imageview?
JValue[] paramCarName = new JValue[] {
    new JValue (JNIEnv.ToJniHandle (imageview))
};

...

Вышеупомянутое в настоящее время компилируется нормально, но я не могу запустить его, поскольку у меня есть только бесплатная версия. Любая информация об этом будет замечательной, поскольку я уверен, что я злоупотребляю этим.

благодаря

  • 0
    Что вы подразумеваете под «банкой, с которой я связан»? Прошли ли вы процесс создания библиотеки привязки Java, чтобы добавить оболочку C # вокруг кода Java, который вы пытаетесь вызвать?
  • 0
    Нет, я пытаюсь избежать библиотеки привязок Java. Я пытался использовать Xamarin Studio, и это приводило ко многим ошибкам (это большая банка, чем в моем примере). Я надеялся, что смогу включить jar в дистрибутив приложения и просто вызвать два нужных мне метода через JNI, не создавая библиотеку привязки Java.
Теги:
xamarin
xamarin.android

1 ответ

0

Если у вас возникли проблемы с подключением баннера, вы сможете исправить ошибки с помощью Transforms/Metadata.xml (документация здесь). С помощью этого файла вы можете подавлять привязки для классов или целых пакетов, которые вызывают проблемы с генерацией кода.

Если Metadata.xml не может выполнить эту работу, другой (менее желательный) вариант заключается в создании собственной библиотеки Java, которая обертывает ту, которая не будет связываться, и предоставляет только методы, необходимые для доступа с С#. Затем свяжите эту банку.

Но, похоже, у вас есть бесплатная версия Xamarin (возможно, почему вы пытаетесь избежать привязки jar, поскольку для этого требуется платная версия), поэтому я попытаюсь исправить код JNI:

// C#

IntPtr classHandle;
IntPtr theClass = JNIEnv.FindClass("com/test/Car", classHandle);
IntPtr theMethod = JNIEnv.GetMethodID(theClass, 
    "makeCar", "(Ljava/lang/String;)V");
// Just create a new JValue with your C# Android object peer
JNIEnv.CallStaticObjectMethod(classRef, methodRef, new JValue[] {
        new JValue(imageView)
    });

Мой JNI не супер-продвинутый, поэтому возьмите с собой несколько солей. Но в соответствии с кодом, созданным Xamarin Studio для привязки jar, вышеуказанное должно быть (близко к) правильным.

  • 0
    Привет Бретт, спасибо за информацию - да, я обновился до пробной версии студии Xamarin и наконец смог скомпилировать и запустить этот код. Теперь все работает, кроме метода, в котором я пытаюсь передать в C # ImageView одноранговый узел как JValue. Приложение просто рухнет с (SIGABRT). Есть ли у вас какие-либо документы, в которых говорится о передаче представления C # peer на землю JNI? Спасибо
  • 0
    Похоже, что CallStaticObjectMethod принимает массив JValues, который может быть проблемой. Я обновлю свой ответ с правильным вызовом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню