java代码通过JNI调用c函数

拈花ヽ惹草 提交于 2019-12-30 15:23:07

java代码通过JNI调用c函数

一. 总览

在Java代码中通过JNI调用C函数的步骤如下:

第一步:编写java代码 :在Java类中声明本地方法

第二步:编译java代码 :javac HelloJNI.java 生成 HelloJNI.class

第三步:生成C语言头文件 :使用javah命令,生成饱含JNI本地函数原型的头文件

第四步:编写C代码 :实现JNI本地函数

第五步:生成共享库 :生成C共享库

第六步:运行java程序 :通过JNI,调用JNI本地函数

二. 步骤

第一步:编写java代码:

class HelloJNI
{
    /* 本地方法声明 */
    native void printHello();
    native void printString();
    
    /* 加载库 libhellojni.so*/
    static { System.loadLibrary("hellojni"); }
    
    public static void main(String args[])
    {
        HelloJNI myJNI = new HelloJNI();
        
        /* 调用本地方法(实际调用的是使用C语言编写的JNI本地函数) */
        myJNI.printHello();
        myJNI.printString("Hello World from printString fun");
    }
}

第二步:编译java代码:使用

使用Java编译器(javac),编译第一步编写的Java源码。

#javac HelloJNI.java

生成HelloJNI.class

第三步:生成C语言头文件

使用javah命令生成C函数原型的HelloJNI.h头文件。

#javah <包含native关键字声明的方法的Java类名称>
#javah HelloJNI

生成HelloJNI.h

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

#ifndef _Include_HelloJNI
#define _Include_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函数原型生成后,开始编写hellojni.c文件,具体实现JNI本地函数。

首先把定义在HelloJNI.h头文件中的函数原型复制到hellojni.c文件中。

hellojni.c文件:

#include "HelloJNI.h"
#include <stdio.h>

/* 添加名称为 env 与 obj 的两个参数 */
JNIEXPORT void JNICALL java_HelloJNI_printHello(JNIEnv *,jobject)
{
    printf("Hello World!\n");
    return;
}
JNIEXPORT void JNICALL java_HelloJNI_printString(JNIEnv *,jobject,jstring)
{
    /* 将java String转换为C字符串 */
    const char *str = (*env)->GetStringUTFChars(env, string, 0);
    printf("%s!\n",str);
    
    return;
}

第五步:生成C共享库

经过第三步和第四步,C语言头文件与函数实现都已经完成,接下来,生成C共享库。

arm-linux-gcc -fPIC -shared hellojni.c -o hellojni.so

第六步:运行java程序

这样我们第一步中的java程序就可以加载hellojni.so文件,实现java调用C函数。

#java HelloJNI
Hello world!
Hello World from printString fun()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!