java.lang.UnsatisfiedLinkError Windows上的JNI错误

时间:2015-09-07 06:07:22

标签: java c java-native-interface

我尝试在mac和windows上使用本机方法运行我的java。

使用本机方法的类:

public class NativeMethods {

    static {
        System.loadLibrary("nativeLib");
    }

    public static native void printFromJni();
}

使用main方法的类:

public class Demo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub  

        NativeMethods.printFromJni();
    }

}

JNI标题:

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

#ifndef _Included_com_sdk_NativeMethods
#define _Included_com_sdk_NativeMethods
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     com_sdk_NativeMethods
 * Method:    printFromJni
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_sdk_NativeMethods_printFromJni
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

c file:

#include <stdio.h>
JNIEXPORT void JNICALL Java_com_sdk_NativeMethods_printFromJni
(JNIEnv *env, jclass class){
    printf("hello from jni. \n");
}

如果我在MAC上编译c文件:

gcc -o libNativeLib.so -shared -I/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/include  nativeLib.c -lc

并运行:

java Demo

它的工作正确。

但如果我在Windows上编译c文件:

gcc -o nativeLib.dll -shared -I"C:\P
rogram Files\Java\jdk1.8.0_60\include" nativeLib.c
 -std=c99 -I"C:\Program Files\Java\jdk1.8.0_60\include\win32"

我收到错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.sdk.Nati
veMethods.printFromJni()V
        at com.sdk.NativeMethods.printFromJni(Native Method)
        at Demo.main(Demo.java:9)

如果我在mac上编译c文件(使用-m32标志)并在Windows上复制库我会收到错误:

Can't load this .dll (machine code=0x7) on
 a IA 32-bit platform

哪里有问题?请帮忙。

我找到了解决方案

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I[Java_HOME]/include -I[Java_HOME]/include/win32 -shared -o Sample1.dll Sample1.c

1 个答案:

答案 0 :(得分:0)

首先在主类中创建Nativemethods类的对象,然后尝试运行该函数。 如果仍然存在错误,请告诉我。我将在我的系统中运行,让你知道错误究竟是什么。

顺便说一下这两个类都在同一个文件中? 因为如果不是那么在编译java程序时你需要注意在生成头文件的同时获得正确的编译..(这一步对你来说没问题吗?)

同时运行javafile时会为dll文件提供路径。

-Djava.library.path = "Write path"