我有一个本机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,这对我来说并不是一个真正的选择。
答案 0 :(得分:0)
它不会起作用,简单就是这样。 JNI DLL的设计和构建是由JVM加载的。您将无法提供调用该库中包含的任何函数所需的env或jvm指针。你唯一的选择是创建第二个DLL来创建一个JVM的新实例然后调用你拥有的DLL,但如果你从.Net调用Java,你可以用Java保存它。