我已经在Mac OS X中使用XCode创建了一个动态库(.dylib),其中包含JNI(Java Native Interface)头文件和c源文件HelloWorld.h和HelloWorld.c.JDK版本为1.7.0_51。我已将“/Library/Java/JavaVirtualMachines/jdk1.7.0.51.jdk/Contents/Home/include”中的“include”文件夹复制到XCode项目中。我构建了创建“libJNIToCDynamic.dylib”的项目。关于JNI的使用,我关注了博客“http://solutions.weblite.ca/tutorials/jni_osx/”。
HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
HelloWorld.c
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World! using JNI \n");
return;
}
我已经编写了以下Java代码,以便在Mac OS X中使用Eclipse加载.dylib库。以下是加载库的代码: -
class HelloWorld {
static {
System.load("/Users/veerendra/Downloads/libJNIToCDynamic.dylib");
}
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
}
然后我生成了HelloWorld.class并将.class和.dylib放在一个文件夹中。在终端中,我成功运行了HelloWorld.class并在控制台“Hello World!using JNI”中打印。 Java在Mac OS X中运行正常,没有错误。
后来,我尝试使用带有路径System.load(“F:\ Android \ DependentLibraries \ libJNIToCDynamic.dylib”)的Eclipse工具运行java以在Windows中加载相同的库“.dylib”,并且出现以下错误: - < / p>
线程“main”中的异常java.lang.UnsatisfiedLinkError:F:\ Android \ DependentLibraries \ libJNIToCDynamic.dylib:找不到依赖库 at java.lang.ClassLoader $ NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary1(Unknown Source) at java.lang.ClassLoader.loadLibrary0(Unknown Source) at java.lang.ClassLoader.loadLibrary(Unknown Source) 在java.lang.Runtime.load0(未知来源) 在java.lang.System.load(未知来源) 在HelloWorld。(HelloWorld.java:9)
在Mac OS X中生成的动态库.dylib在Mac中成功加载但在尝试加载Windows中的.dylib时不会引发错误。
运行otool的依赖库: - Veerendras-MacBook:~veerendra $ otool -L /Users/veerendra/Downloads/libJNIToCDynamic.dylib /Users/veerendra/Downloads/libJNIToCDynamic.dylib: /usr/local/lib/libJNIToCDynamic.dylib(兼容版本1.0.0,当前版本1.0.0) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation(兼容版本300.0.0,当前版本945.11.0) /usr/lib/libobjc.A.dylib(兼容版本1.0.0,当前版本228.0.0) /usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本169.3.0)