从C#调用本机JNI DLL

时间:2014-08-11 18:36:47

标签: java c# dll java-native-interface

我有一个本机DLL abc.dll(没有源代码),最初用于Java中的JNI调用,如下所示:

public class ABC_Proxy
{
    private native void callABC(String parameter);

    public ABC_Proxy()
    {
        System.loadLibrary("abc");
    }

    public void Start(String paramater)
    {
        callABC(paramater);
    }
}

现在我正在尝试在C#中执行相同的功能。使用 dumpbin 我找到了正确的完整入口点,这是我到目前为止所提出的:

class Abc
{
    [DllImport("abc.dll", EntryPoint="_Java_my_namespace_abc_1Proxy_callABC@12")]
    private static extern void CallAbc(string parameter);

    public void Start(string parameter)
    {
        CallAbc("test");
    }
}

我可以看到CallAbc已执行并执行了某些操作(它创建了一个文件),但随后它会抛出AccessViolationException,大概是在它尝试访问参数时。

PureDLLHelper表示该函数有3个参数,在阅读this JNI tutorial后,我觉得我还需要传递参数JNIEnv*, jobject来模拟JNI调用。但是从这里开始我就失去了......

有什么想法吗?甚至可能是我想要实现的目标吗?

修改我只想提及this forum post,它可以很好地解释所涉及的问题以及它们可能的解决方法。但是,解决方案基于 Xamarin.Android 来弥合C#/ Java差距并掌握JNIEnv,这对我来说并不是一个真正的选择。

1 个答案:

答案 0 :(得分:0)

它不会起作用,简单就是这样。 JNI DLL的设计和构建是由JVM加载的。您将无法提供调用该库中包含的任何函数所需的env或jvm指针。你唯一的选择是创建第二个DLL来创建一个JVM的新实例然后调用你拥有的DLL,但如果你从.Net调用Java,你可以用Java保存它。