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

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