JNI和共享库

时间:2018-02-10 17:34:57

标签: java-native-interface mingw

尝试创建dll。
首先,我创建了一个.java文件,如下所示:

class Main
{
    static 
    {
        System.loadLibrary("sample_dll");
    }

    static native void sritest();

    public static void main(String [] a)
    {
        sritest();
    }
}

然后我将它编译为.class没有错误。
然后使用javah我创建了Main.h。

然后我用c ++编写以下代码。

#include <jni.h>
#include <Main.h>
JNIEXPORT void JNICALL Java_Main_sritest(JNIEnv *env,jobject obj)
{
    printf("hi");
}

然后我使用MinGw通过以下代码

编译了这个
g++ -c sample_dll.cpp

g++ -shared -o sample_dll.dll sample_dll.o

然后我把它放在java库路径中 然后我运行Main.java但发生以下异常

  

不满意的链接错误; sritest()V

1 个答案:

答案 0 :(得分:0)

我找到了答案。我犯了三个错误。使用c ++编译时,我们必须在extern&#34; C&#34; {}块中声明我的jni函数。第二,在minGW编译器中编译时,我们应该使用以下代码并实现jdk的include文件夹。代码现在有效,我的程序运行顺利,没有问题。 用于编译.o到.dll代码的命令行代码是在创建sample_dll.o之后我们必须做的

g++ -Wall -D_JNI_IMPLEMENTATION -Wl,--kill-at -Ic:/path_of_include_folder_in_jdk_without_drive_letter -Ic:/path_of_win32_folder_in_include_folder_in_jdk_without_drive_letter -shared -o sample_dll.dll sample_dll.o

最后一个错误是我想要包含由我的java代码创建的javah utlity编译的Main.h。 这是由

完成的
Javac Main.java
Javah Main

然后创建Main.h创建的头文件并将其放在c ++编译器的include文件夹中。那在我的电脑c:\ minGW \ include。 在c ++代码中添加额外的预处理器

#include<Main.h>

全部完成创建dll并将其放在一个默认的java库路径中。可以通过在java

中使用以下函数来获取路径
System.out.println (System.getProperty ("java.library.path"));