适用于Windows 7的Java Native Library,printf

时间:2016-09-27 15:52:39

标签: java c java-native-interface

我正在尝试使用gcc为Windows 7构建一个java本机库。 我得到它来编译和构建。

作为测试,我只是尝试在本机代码中执行printf()

gcc -o Test.so -shared -O -I/home/fred/jdk1.8.0_65/include -I/home/fred/jdk1.8.0_65/include/linux Test.c

在Test.c中:

JNIEXPORT void JNICALL Java_Test_print(JNIEnv *env, jobject jo) {
    printf("Test\n");
}

运行时,它不会从printf()返回。

如果我删除printf(),则Java_Test_print()返回。

如果我用while(1){}替换printf() 它按预期挂起。

我知道它会转到我的本机代码,但它不会从printf()返回并崩溃JVM。

dll上的ldd显示它正在使用/usr/bin/cygwin1.dll

我怀疑调用约定存在问题。即使是这样,我也不知道该怎么做。

有没有人成功开发过Windows的本机库?或者有任何指针。谢谢!

1 个答案:

答案 0 :(得分:0)

   Step 1:

   Test.c:
   #include <jni.h>
   #include <stdio.h>
   #include <string.h>
    JNIEXPORT void JNICALL Java_Test_print(JNIEnv *env, jobject jo) {
      printf("Test\n");
      return;
    }

   Step 2:
    Build .dll file
    gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o Test.dll Test.c

   Step 3:
    public class Test {
    public native void print();
    static {
        System.loadLibrary("Test");
         }
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { 
      Test test = new Test();
              test.print();
     }
  }

参考链接https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html