从Java程序中调用C函数
最终在文件夹的文件结构为:
1.在Java类中声明一个本地方法
HelloNative.java文件
class HelloNative
{
public static native void greeting();
}
Java编程语言使用关键字native表示本地方法。
2.运行javah以获得包含该方法的C声明的头文件
用-h标志运行javac,并提供头文件放置的目录
javac -h . HelloNative.java
这时候文件夹会生成HelloNative.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3.用C实现该本地方法
在文件夹创建HelloNative.c文件
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env,jclass cl)
{
printf("Hello Native World!\n");
}
4.将代码置于共享库中
运行批处理文件vcvars32.bat
输入命令:
cl -I C:\Java\jdk1.8.0_231\include -I C:\Java\jdk1.8.0_231\include\win32 -LD HelloNative.c -FeHelloNative.dll
其中C:\Java\jdk1.8.0_231为JDK的安装目录
最终会在文件夹中生成
HelloNative.dll
HelloNative.exp
HelloNative.obj
HelloNative.lib
这些文件就是生成的类库
5.在Java程序中加载该类库并测试
HelloNativeTest.java
class HelloNativeTest
{
public static void main(String[] args)
{
HelloNative.greeting();
}
static
{
System.loadLibrary("HelloNative");
}
}
先编译java文件
javac -classpath . HelloNativeTest.java
运行
java -classpath . HelloNativeTest
最终成功打印