我尝试在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
答案 0 :(得分:0)
首先在主类中创建Nativemethods类的对象,然后尝试运行该函数。 如果仍然存在错误,请告诉我。我将在我的系统中运行,让你知道错误究竟是什么。
顺便说一下这两个类都在同一个文件中? 因为如果不是那么在编译java程序时你需要注意在生成头文件的同时获得正确的编译..(这一步对你来说没问题吗?)
同时运行javafile时会为dll文件提供路径。
-Djava.library.path = "Write path"