另一个带有JNI的java.lang.UnsatisfiedLinkError

时间:2014-04-02 18:54:29

标签: java c++ eclipse java-native-interface

我没有找到我的问题的灵魂,并从昨天开始寻找。 我正在使用Windows 7和Eclipse与CDT和MinGW。

这是我的JAVA课程:

package pl.asg.front;

public class ASGFrontMain {
static 
{
    System.loadLibrary("libASG");
}

public native void sayHello();

public static void main(String[] args) {
    System.out.println("Hello from JAVA!");
    new ASGFrontMain().sayHello();
}
}

这是我的jni javah生成的头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class pl_asg_front_ASGFrontMain */

#ifndef _Included_pl_asg_front_ASGFrontMain
#define _Included_pl_asg_front_ASGFrontMain
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     pl_asg_front_ASGFrontMain
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_pl_asg_front_ASGFrontMain_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

使用eclipse外部工具thingy: 地点:     C:\ Program Files(x86)\ Java \ jdk1.7.0_51 \ bin \ javah.exe 工作目录:     $ {workspace_loc:/ ASG / bin中} 参数:     -d $ {workspace_loc:/ ASG / asg_jni} $ {java_type_name}

这是我的.cpp实现:

/*
 * pl_asg_front_ASGFrontMain.c
 *
 *  Created on: 2 kwi 2014
 *      Author: karol
 */

#include "pl_asg_front_ASGFrontMain.h"

JNIEXPORT void JNICALL Java_pl_asg_front_ASGFrontMain_sayHello
  (JNIEnv *env, jobject obj)
{

}

我得到了这个输出:

Exception in thread "main" java.lang.UnsatisfiedLinkError: pl.asg.front.ASGFrontMain.sayHello()V
at pl.asg.front.ASGFrontMain.sayHello(Native Method)
Hello from JAVA!
at pl.asg.front.ASGFrontMain.main(ASGFrontMain.java:13)

任何解决方案?提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先,如果您的本机库在Windows上被称为ASG.dll,它将在* nix系统上调用libASG.so,在Darwin上调用libASG.dylib。因此,应该通过名称加载库,允许JVM填充正确的前缀和扩展名。例如:System.loadLibrary("ASG")请注意,OS X在Java中使用了错误的扩展名(.jnilib而不是.dylib)。 7。

现在,您仍然有一个UnsatisfiedLinkError,这是因为JVM不知道从哪里加载该库。如果使用System.loadLibrary,则必须将属性java.library.path设置为dll文件的位置。或者,您可以使用System.load()指定本机库的完整路径和文件名(包括前缀和扩展名)。