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()!
来源:CSDN
作者:Gti-杠猪
链接:https://blog.csdn.net/qq_40083589/article/details/103765908