2015-09-07 157 views
0

我尝试在mac和windows上使用本地方法运行我的java。Windows上的java.lang.UnsatisfiedLinkError JNI错误

类与本地方法:

public class NativeMethods { 

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

    public static native void printFromJni(); 
} 

类主要方法:

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文件:

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

如果我编译C文件的MAC:

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 

问题在哪里?请帮忙。

我发现SOLUTION

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

不要在mac上编译..在Windows本身编译。它应该只能以这种方式工作... – spt025

回答

0

首先创建Nativemethods类的对象在主类,然后尝试运行的功能。 告诉我,如果仍然存在错误。我将运行在我的系统中,并让您知道实际是什么错误。

顺便说一下,两个类都在同一个文件? 因为如果没有,那么在编译时,你需要小心得到正确的编译,同时产生的头文件.. java程序(这一步制定好适合你?)

还一边跑javafile给了dll文件路径。

-Djava.library.path = "Write path" 
相关问题