2016-09-27 11 views
3

gccを使用してWindows 7用のJavaネイティブライブラリを構築しようとしています。 私はそれをコンパイルしてビルドします。Windows 7用Javaネイティブライブラリprintf

テストとして、私はネイティブコードでprintf()を実行しようとしています。 test.cので

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 

:それはprintf関数から戻らない実行

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

()。

printf()Java_Test_print()が削除された場合は返されます。

printf()をwhile(1){}に置き換えた場合、予期したとおりに がハングします。

私はネイティブコードになっていますが、それはprintf()から戻ってこないし、JVMをクラッシュさせます。

dddのlddは、/usr/bin/cygwin1.dllを使用していることを示しています。

呼び出し規約に問題があると思われます。そのような場合でも、私はそれについて何をするべきではありません。

誰もWindows用のネイティブライブラリを開発できましたか?またはポインタを持ってください。ありがとう!

+0

あなたは 'stdio.h'が含まれたのですか?あなたに何か警告がありますか? –

答えて

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

関連する問題