Java調用C++

Java調用C/C++大概有這樣幾個步驟:
編寫帶有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++本地庫



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章