JNI是Java Native Interface
的縮寫,是為了在Java上能夠調用本地語言尤其是C
和c++
設計的。
下面就看下如何在Mac OS
上面如何使用JNI
的調用C語言。
編寫Java類
先定義一個Java
類
public class MacJni {
public native void sayHello();
static {
System.loadLibrary("macjni");
}
public static void main(String[] args) {
MacJni macJni = new MacJni();
macJni.sayHello();
}
}
這里定義了一個MacJni
的類,在它的main函數中調用了定義的native
的方法sayHello。
在static中加載native
的類庫macjni
,注意JNI的動態庫在linux上面的命名是.so
文件,而在Mac OS
上面的命名是.jnilib
,類庫的名字需要加上lib,也就是在Mac OS
上面動態庫的名稱應該是libmacjni.jnilib
生成.class
通過命令生成.class
文件:
javac MacJni.java
這樣就可以生成了一個MacJni.class
的文件。
生成.h文件
通過命令可以直接生成.class
對應.h
文件:
javah MacJni
生成了一個MacJni.h
的文件。文件內容如下:
* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MacJni */
#ifndef _Included_MacJni
#define _Included_MacJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MacJni
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_MacJni_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
該文件定義了一個方法Java_MacJni_sayHello
,這個方法對應定義的native方法public native void sayHello();
。
JNI在C語言
中定義的規則是:Java_包名_類名_方法名
編寫.c文件
根據定義.h
方法,需要編寫一個一個.c文件MacJni.c,用來實現.h
中的方法
#include <stdio.h>
#include "MacJni.h"
JNIEXPORT void Java_MacJni_sayHello(JNIEnv * env, jobject obj){
printf("hello from jni");
}
這個方法很簡單就是打印一句話:hello from jni
。
編譯.c
在MacJni.h
中有一句話
#include <jni.h>
jni.h
是jdk中C語言庫的頭文件,在編譯.c的時候需要指定jni.h的所在。在Mac OX中他所在的位置是:
/System/Library/Frameworks/JavaVM.framework/Headers
使用gcc
編譯:
gcc -I/System/Library/Frameworks/JavaVM.framework/Headers -c MacJni.c
就可以得到一個編譯好的文件MacJni.o
,下面需要把.o文件
打包成動態庫
。
打包動態庫
使用gcc
可以直接打包動態庫
gcc -dynamiclib -o libmacjni.jnilib MacJni.o
把.o文件打包成了libmacjni.jnilib
,就可以通過Java調用C語言了。
java MacJni
hello from jni