通过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);
        }
         
    }
}