Java调用c
这次demo的操作步骤如下
你好! 这是我第一次使用 java本地方法 。如果你想学习如何使用java本地方法, 可以仔细阅读这篇文章,了解一下java调用c方法的基本语法知识。
先定义一个java类,这个java类带有一个native方法和一个测试方法
D:\download_projects\home\JNITest\src\memory下的Meet.java类
public class Meet {
static{
System.loadLibrary("Meet");
}
native void fuckYou();
public static void main(String[] args) {
new Meet().fuckYou();
}
}
把这个类编译
javac Meet.java,生成Meet.class
把这个类生成头文件(.h)
javah memory.Meet,生成memory_Meet.h文件,如下所示:
native方法在h文件里的定义格式为java_包路径_类名_方法,测试方法不会在h文件里生成对应方法
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class memory_Meet */
#ifndef _Included_memory_Meet
#define _Included_memory_Meet
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: memory_Meet
* Method: fuckYou
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_memory_Meet_fuckYou
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
写一个c文件,让这个c文件里的c方法引用.h文件,c文件叫做Meet.c
方法名字和.h文件的名字一样,java_包路径_类名_方法(JNIEnv *env, jobject thisObj),env是java运行环境,thisObj是Java方法
#include<jni.h>
#include <stdio.h>
#include "memory_Meet.h"
JNIEXPORT void JNICALL Java_memory_Meet_fuckYou(JNIEnv *env, jobject thisObj) {
printf("Fuck you on Meeting you!\n");
return;
}
把Meet.c生成Meet.o文件
百度了一下o文件好像是linux环境下用的,windows下是dll文件
gcc -c -I"C:\Program Files\Java\jdk1.8.0
dk1.8.0_201\include\win32" memory/Meet.c
把这个o文件转成dll文件,生成Meet.dll
gcc -Wl,--add-stdcall-alias -shared -o Meet.dll Meet.c
测试结果
执行Meet.c,打印出Meet.c中c实现的打印语句:
Fuck you on Meeting you!