2014-09-03 112 views
1

我正在使用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)) 
}; 

... 

以上目前编译好,但我不能运行它,因为我只有免费版。任何有关这方面的信息都会很好,因为我确信我在滥用这个信息。

感谢

+0

你是什么意思的“罐子我已经链接到”。您是否经历了创建Java绑定库的过程,以便在您尝试调用的Java代码周围添加C#包装器? – jensendp 2014-09-05 18:03:44

+0

不,我试图避免Java绑定库。我尝试使用Xamarin工作室,它导致了很多错误(这是一个比我的例子更大的jar)。我希望我可以在应用程序发行版中包含jar,只需通过JNI调用我需要的两个方法,而不必创建Java绑定库。 – user291701 2014-09-05 23:41:48

回答

0

如果你有麻烦广口瓶中,绑定你可以用变换/ 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绑定生成的代码,上面应该(接近)正确。

+0

嗨布雷特,感谢您的信息 - 是的,我更新到试用版的Xamarin工作室,并最终可以编译和运行此代码。除了我尝试将C#ImageView对象作为JValue传递的方法之外,现在一切正在运行。该应用只会与(SIGABRT)崩溃。你有任何关于将C#同行视图传递给JNI土地的文档吗?谢谢 – user291701 2014-09-07 17:08:27

+0

它看起来像'CallStaticObjectMethod'接受一个可能是问题的JValues数组。我会用正确的电话更新我的答案。 – 2014-09-08 22:16:46

+0

嘿布雷特,对不起,我一直在使用JValue []数组,像你在更新的答案,这仍然导致崩溃。我不太确定Xamarin如何将它的ImageView版本以dalvik的形式公开为ImageView的概念。如果两者甚至可以通过JNI以这种方式兼容?我一直在寻找一个试图通过JNI将视图从Xamarin传递给jar的例子,但是没有发现任何东西。你看过Xamarin团队的这个话题的任何文档吗? – user291701 2014-09-09 00:22:29

相关问题