如何将C#对象传递给Xamarin中的JNI方法?

时间:2014-09-03 22:14:21

标签: c# xamarin xamarin.android

我使用的是Xamarin,需要在我已经链接的jar中调用两个静态java方法。这是jar中的java类:

package com.test;

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

我不确定如何将两种方法的参数传递给JNI代码。 JNIEnv.Call ** Method()类为参数提供了一个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))
};

...

以上目前编译正常,但我无法运行它,因为我只有免费版本。任何关于此的信息都会很棒,因为我确定我误用了这个。

由于

1 个答案:

答案 0 :(得分:0)

如果您无法使用jar进行绑定,则可以使用Transforms / Metadata.xml(文档here)修复错误。使用该文件,您可以禁止导致代码生成问题的类或整个包的绑定。

如果Metadata.xml无法完成工作,另一个(不太理想的)选项是创建自己的Java库,它包装不会绑定的Java库,并且只公开需要从C#访问的方法。然后绑定那个罐子。

但是,听起来你有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绑定生成的代码,上面应该(接近)正确。