Я использую 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))
};
...
Вышеупомянутое в настоящее время компилируется нормально, но я не могу запустить его, поскольку у меня есть только бесплатная версия. Любая информация об этом будет замечательной, поскольку я уверен, что я злоупотребляю этим.
благодаря
Если у вас возникли проблемы с подключением баннера, вы сможете исправить ошибки с помощью 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, вышеуказанное должно быть (близко к) правильным.
CallStaticObjectMethod
принимает массив JValues, который может быть проблемой. Я обновлю свой ответ с правильным вызовом.