Java 通過 JNI 調用 C 函數

第一步:編寫 java 代碼

class HelloJNI{
		//本地方法聲明
        native void printHello();
        native void printString(String str);
		//加載庫
        static{System.loadLibrary("hellojni");}

        public static void main(String args[]){
                HelloJNI myJNI = new HelloJNI();
				//調用本地方法
                myJNI.printHello();
                myJNI.printString("Hello world from printString fun");
        }
}

第二步:編譯 java 代碼

javac HelloJNI.java

第三步:生成 C 頭文件

javah HelloJNI

生成 HelloJNI.h 頭文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    printHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printHello
  (JNIEnv *, jobject);

/*
 * Class:     HelloJNI
 * Method:    printString
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printString
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

第四步:編寫 C/C++ 代碼

#include "HelloJNI.h"
#include "stdio.h"

JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv * env, jobject obj){
        printf("Hello world!\n");
        return;
}

JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv * env, jobject obj, jstring string){
		//將 java String 轉換成 C 字符串
        const char *str = (*env)->GetStringUTFChars(env,string,0);
        printf("%s!\n",str);
        return;
}

第五步:生成 C 共享庫(Ubuntu下)

gcc -shared -fPIC -I /usr/lib/jvm/java-7-openjdk-amd64/include hellojni.c -o libhellojni.so

注:-I 參數指定 jni.h 的路徑

第六步:運行 java 程序

java -Djava.library.path=. HelloJNI

注:需要將當前路徑添加到 java.library.path 使其找到生成的共享庫

參考資料:
1.《Android框架揭祕》
2. https://blog.csdn.net/fengqiaoyebo2008/article/details/6210499

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