2013-07-30 165 views
1

我得到以下明确的错误,当我在Java测试JNI:异常线程“main” java.lang.UnsatisfiedLinkError中

Exception in thread "main" java.lang.UnsatisfiedLinkError: Italk2learn.hello()V 
    at Italk2learn.hello(Native Method) 
    at Italk2learn.main(Italk2learn.java:10) 

有与DLL或路径没有问题,因为我的Java的静态代码一流的作品:

static { 
     try { 
      System.loadLibrary("Italk2learn"); 
     } catch (Exception e) { 
      System.err.println(e); 
      System.exit(1); 
     } 
    } 

而且我认为它得到了图书馆罚款。

我使用JVM 32位编译并获取C++头文件(javah)和MinGW32 for C++。在这两种情况下,我都使用Eclipse作为C++和Java。

这是我的代码:

的Java:

public class Italk2learn { 

    public native void hello(); 

    public static void main(String[] args) { 
     System.out.println("Hello World Java!"); 
     try { 
      new Italk2learn().hello(); 
     } catch (Exception e) { 
      System.err.println(e); 
      System.exit(1); 
     } 
    } 
    static { 
     try { 
      System.loadLibrary("Italk2learn"); 
     } catch (Exception e) { 
      System.err.println(e); 
      System.exit(1); 
     } 
    } 
} 

C++:

#include <jni.h> 
#include <stdio.h> 
#include "italk2learn.h" 

JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) { 
    printf("Hello World C++!\n"); 
#ifdef __cplusplus 
    printf("__cplusplus is defined\n"); 
#else 
    printf("__cplusplus is NOT defined\n"); 
#endif 
    return; 
} 
+0

你是如何构建你的DLL的?如果你看看Italk2learn.DLL有多大,它在PATH中? –

+1

我在Eclipse中使用GCC C++编译器。大小是75 KB(包括MinGW和JNI),是的,它在我的windows环境变量的路径。 – tludmetal

回答

3

我找到了答案!看起来,在Windows中使用JNI时,它寻找一个从_Java_开始的函数,而在其他任何平台上它都会寻找Java_。为什么这是这种情况,而不是写在我不知道的文档中,但它使一切完美无缺!

当javah创建头文件时,每个函数都被命名为Java_package_Class_method。奇怪的是,当像这样编译时,JNI无法为本地方法找到正确的函数并吐出错误,但是如果在Java之前添加了下划线,那么JNI将能够找到该函数。

2

如果你正在使用C编译++,你有extern "C"来包装你的JNI方法,以确保编译器不适用自己的损坏:

extern "C" { 
    JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) { 
     // .. 
    } 
} 

参见:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp224

+0

'javah'已经在生成到.h文件中的声明中执行了该操作,并且在.cpp文件中包括.h文件将它应用于声明中的定义。 – EJP

相关问题