如何将C#对象传递给Xamarin中的JNI方法?
我正在使用Xamarin,需要通过调用两个静态Java方法,我已经链接到一个罐子里。这里是jar中的java类:如何将C#对象传递给Xamarin中的JNI方法?
package com.test;
public class Car {
public static Car makeCar(String name);
public void drawCar(ImageView imageview);
}
我不知道如何将这两个方法的参数传递给JNI代码。该JNIEnv.Call **()的方法类负责参数JValue []数组,我想用它来包装一个C#字符串,并将其命名为所有像这样:
// 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#版本的同一问题:
// 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))
};
...
以上目前编译好,但我不能运行它,因为我只有免费版。任何有关这方面的信息都会很好,因为我确信我在滥用这个信息。
感谢
如果你有麻烦广口瓶中,绑定你可以用变换/ metadata.xml中(文档here)修复错误。使用该文件,您可以禁止导致代码生成问题的类或整个包的绑定。
如果Metadata.xml无法完成工作,另一个(较不理想的)选项是创建自己的Java库,它封装了不会绑定的Java库,并且只公开您需要从C#访问的方法。然后绑定那个罐子。
但是,这听起来像你有Xamarin(也许就是为什么你要设法避免罐子结合,因为需要付费版),所以我会尝试修复您的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绑定生成的代码,上面应该(接近)正确。
嗨布雷特,感谢您的信息 - 是的,我更新到试用版的Xamarin工作室,并最终可以编译和运行此代码。除了我尝试将C#ImageView对象作为JValue传递的方法之外,现在一切正在运行。该应用只会与(SIGABRT)崩溃。你有任何关于将C#同行视图传递给JNI土地的文档吗?谢谢 – user291701 2014-09-07 17:08:27
它看起来像'CallStaticObjectMethod'接受一个可能是问题的JValues数组。我会用正确的电话更新我的答案。 – 2014-09-08 22:16:46
嘿布雷特,对不起,我一直在使用JValue []数组,像你在更新的答案,这仍然导致崩溃。我不太确定Xamarin如何将它的ImageView版本以dalvik的形式公开为ImageView的概念。如果两者甚至可以通过JNI以这种方式兼容?我一直在寻找一个试图通过JNI将视图从Xamarin传递给jar的例子,但是没有发现任何东西。你看过Xamarin团队的这个话题的任何文档吗? – user291701 2014-09-09 00:22:29
你是什么意思的“罐子我已经链接到”。您是否经历了创建Java绑定库的过程,以便在您尝试调用的Java代码周围添加C#包装器? – jensendp 2014-09-05 18:03:44
不,我试图避免Java绑定库。我尝试使用Xamarin工作室,它导致了很多错误(这是一个比我的例子更大的jar)。我希望我可以在应用程序发行版中包含jar,只需通过JNI调用我需要的两个方法,而不必创建Java绑定库。 – user291701 2014-09-05 23:41:48