我使用的是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))
};
...
以上目前编译正常,但我无法运行它,因为我只有免费版本。任何关于此的信息都会很棒,因为我确定我误用了这个。
由于
答案 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绑定生成的代码,上面应该(接近)正确。