編寫帶有native方法的Java類, 使用javac工具編譯Java類
使用javah來生成與native方法對應的頭文件
實現相應的頭文件, 並編譯爲動態鏈接庫(windows下是.dll, linux下是.so)
編寫帶有native方法的Java類
public class Sample {
public native int intMethod(int n);
public native boolean booleanMethod(boolean bool);
public native String stringMethod(String text);
public native int intArrayMethod(int[] intArray);
}
編譯Sample.java, 生成Sample.class文件
javac Sample.java
使用javah生成頭文件, 生成Sample.h文件
javah Sample
通過Sample.cpp文件實現Sample.h文件中定義的native方法
#include "Sample.h"
#include <string>
JNIEXPORT jint JNICALL Java_Sample_intMethod
(JNIEnv *env, jobject obj, jint num)
{
return num * num;
}
JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod
(JNIEnv *env, jobject obj, jboolean boolean)
{
return !boolean;
}
JNIEXPORT jstring JNICALL Java_Sample_stringMethod
(JNIEnv *env, jobject obj, jstring string)
{
const char* str = env->GetStringUTFChars(string, 0);
char cap[128];
strcpy(cap, str);
env->ReleaseStringUTFChars(string, 0);
return env->NewStringUTF(strupr(cap));
}
JNIEXPORT jint JNICALL Java_Sample_intArrayMethod
(JNIEnv *env, jobject obj, jintArray array)
{
int i, sum = 0;
jsize len = env->GetArrayLength(array);
jint *body = env->GetIntArrayElements(array, 0);
for (i = 0; i < len; ++i)
{
sum += body[i];
}
env->ReleaseIntArrayElements(array, body, 0);
return sum;
}
編譯Sample.cpp, 其中java頭文件的目錄根據編譯機器進行修改, 生成Sample.o
g++ -I /usr/java/jdk1.7.0_21/include/ -I /usr/java/jdk1.7.0_21/include/linux/ -fPIC -c Sample.cpp
生成動態庫文件,如果使用到其它對象文件(.o文件)以及動態連接庫,則在Sample.o後面增加相應的參數
g++ -shared -Wl,-soname,libSample.so.1 -o libSample.so.1.0 Sample.o
設置動態庫路徑或拷貝到系統目錄(/usr/lib或/usr/lib64)
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
測試
public class TestSample {
public static void main(String[] args) {
System.loadLibrary("Sample");
Sample sample = new Sample();
int square = sample.intMethod(5);
boolean bool = sample.booleanMethod(true);
String text = sample.stringMethod("Java");
int sum = sample.intArrayMethod(new int[]{1,2,3,4,5,8,13});
System.out.println("intMethod: " + square);
System.out.println("booleanMethod: " + bool);
System.out.println("stringMethod: " + text);
System.out.println("intArrayMethod: " + sum);
}
}
參考文獻:
使用JNI進行Java與C/C++語言混合編程(1)--在Java中調用C/C++本地庫, 在Java中調用C/C++本地庫