Java 从C调用本机JNI DLL

Java 从C调用本机JNI DLL,java,c#,dll,java-native-interface,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) { c

我有一个没有源代码的本机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,大概是在它试图访问参数时

这表明该函数有3个参数,阅读之后,我感觉还需要传递参数JNIEnv*,jobject来模拟JNI调用。但是从现在起我迷路了

有什么想法吗?我想达到的目标有可能吗


编辑:我只想提一提,它很好地解释了所涉及的问题以及如何解决这些问题。然而,这些解决方案是基于Xamarin.Android的,以弥补C/Java之间的差距并获得JNIEnv,这对我来说并不是一个真正的选择。

它不起作用,就这么简单。JNI DLL是为JVM加载而设计和构建的。您将无法提供调用该库中包含的任何函数所需的指向env或jvm的指针。您唯一的选择是创建第二个DLL,该DLL创建JVM的新实例,然后调用您拥有的DLL,但是如果您是从.Net调用Java,那么您最好将其全部保存在Java中。

现在还不清楚您要做什么。因为你唯一想要的是能够调用函数,所以理论上是可能的。这是个好主意吗?可能不是,特别是因为您没有来源/支持的方式来调用它。你可能想把它看作是教育活动,并建立自己的本土图书馆来学习。您将知道什么是失败的,并且能够使这个问题更加通用,但有完整的代码。或者干脆放弃这个想法,因为它将来可能会给你带来更多的痛苦。你不需要模拟JNI调用。你想在abc.dll中调用的函数的声明是什么?@Matt你有我所有的信息,包括我希望可以从中派生声明的工作Java调用。考虑到我提到的教程,真正的声明可能是JNIEXPORT void JNICALL\u Java\u my\u namespace\u abc\u 1Proxy_callABC@12JNIEnv*,jobject,jstring@道格,我很困惑。您说过abc.dll是JNI dll使用的dll,但这应该是JNI dll中的函数声明。@matt否,abc.dll是JNI dll,它还包括业务逻辑。没有别的了。我说的是在JNI调用中使用,而不是在另一个JNI dll中使用。