JNI和共享图书馆



尝试创建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

我找到答案。我犯了三个错误。使用C 编译时,我们必须在Extern" C" {}块中声明我的JNI功能。第二,在MINGW编译器中编译时,我们应该使用以下代码,并将实施包括JDK的文件夹。该代码现在可以使用,我的程序在JNI中毫无问题地运行。用于编译.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

最后一个错误是我要包含Main.h由Javah utlity编写的,该h由我的Java代码创建。这是由

完成的
Javac Main.java
Javah Main

然后将Header File Main.H拿出来,然后将其放在C 编译器的Inclupher文件夹中。在我的计算机C中: mingw include。在C 代码中添加其他预处理器

#include<Main.h>

所有完成的创建DLL并将其放在默认Java库路径之一中。可以通过在Java中使用以下功能来获取路径

System.out.println (System.getProperty ("java.library.path"));

最新更新