Java和C之间的调用可以使用JNI来实现,这里笔记下一种最简单的实现流程。
CONTENTS
本地的C文件:
functions.h:
#ifndef FUNCTIONS_H_ #define FUNCTIONS_H_ int add(int a, int b); #endif /* FUNCTIONS_H_ */
functions.c:
#include "functions.h" int add(int a, int b) { return a+b; }
Jni文件:
JniSwapper.java:
备注:
1 作者好久没有搞java了,代码都忘了怎么写了,勿拍砖~~
2 为了简单起见,这里调用动态库时采用绝对路径。
public final class JniSwapper { private JniSwapper() { super(); } static { try { System.load("/home/cstriker1407/workspace/HelloJni/src/libJniSwapper.so"); } catch(UnsatisfiedLinkError e) { System.err.println( "Cannot load library:\n " + e.toString() ); } } public static final native int jni_add(int x, int y); }
根据JniSwapper.java生成JniSwapper.h文件,命令如下:
cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ javac JniSwapper.java cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ javah JniSwapper
JniSwapper.h:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JniSwapper */ #ifndef _Included_JniSwapper #define _Included_JniSwapper #ifdef __cplusplus extern "C" { #endif /* * Class: JniSwapper * Method: jni_add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_JniSwapper_jni_1add (JNIEnv *, jclass, jint, jint); #ifdef __cplusplus } #endif #endif
根据JniSwapper.h文件我们可以编写JniSwapper.c文件。
JniSwapper.c:
#include "JniSwapper.h" #include "functions.h" JNIEXPORT jint JNICALL Java_JniSwapper_jni_1add(JNIEnv *env, jclass cls, jint x, jint y) { return add(x, y); }
生成so:
文件都搞定之后,我们可以生成so,命令如下:
gcc functions.c JniSwapper.c -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include -o libJniSwapper.so
测试文件:
HelloJni.java:
public class HelloJni { public static void main(String[] args) { System.out.println( "100 + 200 = " + JniSwapper.jni_add(100, 200) ); } }
执行:
命令行下执行:
cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ javac HelloJni.java cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ ls functions.c HelloJni.class JniSwapper.c JniSwapper.h libJniSwapper.so functions.h HelloJni.java JniSwapper.class JniSwapper.java cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ java HelloJni 100 + 200 = 300
发表评论