通过Java调用C、C++,一般我们都是用JNI。但是熟悉C的人对jni.h不一定了解。
随着时代的发展,Java对性能的要求越来越高,对底层开发的需求也越来越多。
于是,我想着,是不是可以开发一个框架,对Java调用C、C++进行封装。
Google下,发现竟然已经存在JNA了。好吧,来试用下。
由于是Mac,生成的动态库既不是dll,也不是so了。
参考一些文章说,Mac上是jnilib,但是我试了多次都没有成功。
也发现了一些bugJDK-7134690 : remove legacy jnilib support from ClassLoader and System
但这是已经修复的。下面的报错信息给我们提示了
Unable to load library 'NativeTest': Native library (darwin/libNativeTest.dylib) not found in resource path
JNA只处理这种方式libXXX.dylib(Mac机器上)
下面给个例子:
NativeTest.h
#ifndef NATIVETEST_H #define NATIVETEST_H extern "C" int add(int x, int y); #endif
NativeTest.cpp
#include "NativeTest.h" int add(int x, int y) { return x + y; }
gcc -c NativeTest.cpp
gcc -dynamiclib -o libNativeTest.dylib NativeTest.o
import com.sun.jna.Library; import com.sun.jna.Native; public class JNATest { static { System.load("/Users/user/Documents/empleyment/libNativeTest.dylib"); } public interface NativeTest extends Library { public int add(int x, int y); } public static void main(String[] args) { NativeTest nt = (NativeTest) Native.loadLibrary("NativeTest", NativeTest.class); if (nt != null) { int x = nt.add(10, 36); System.out.println(x); } } }