JNI java中调用c语言方法(Mac下)

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信,在java中通过native关键字定义本地方法,并对你要调用的其他语言的方法名对应【对应的意思是有一定命名规则。】,即可在JAVA程序中调用它们。
本教程对应Mac平台Idea开发工具,而且JDK版本不能高于1.8,否则javah将命令不可用。


1.项目准备

新建纯java项目,新建如下文件HelloWorld.javaHelloWorldNative.c

这里写图片描述

2.编写HelloWorld.java文件。

HelloWorld.java 文件内容如下:
public class HelloWorld {

    static {
        //导入 HelloWorld c语言库(即导入libHelloWorldNative.jnilib文件)
        System.loadLibrary("HelloWorldNative");
    }

    //定义一个本地方法【类似java的接口,需要c语言去具体实现方法】
    public static native void cMethod();
    public static void main(String[] args){
        //调用该方法
        cMethod();
    }
}

3.添加两个指令工具:javahgcc

这里写图片描述

Program$JDKPath$/bin/javah
Parameters:-jni -classpath $OutputPath$ -d $FileDir$ $FileClass$
Working directory:$ProjectFileDir$

这里写图片描述

Program:gcc
Parameters:-dynamiclib -I /System/Library/Frameworks/JavaVM.framework/Headers $FileNameWithoutExtension$.c -o lib$FileNameWithoutExtension$.jnilib
或者(如果会报错):-dynamiclib -I $JDKPath$/include -I $JDKPath$/include/darwin $FileNameWithoutExtension$.c -o lib$FileNameWithoutExtension$.jnilib
Working directory:$FileDir$

3.编译java项目

这里写图片描述

可以看到一个out文件夹,里面放着编译后的class文件

4.执行生成头文件

这里写图片描述

生成后可以在同目录下看到HelloWorld.h文件

5.编写c语言方法

HelloWorldNative.c 文件内容如下:
#include <stdio.h>
/* 导入 生成的头文件 */
#include "HelloWorld.h"

/* 此处的方法命名要和头文件方法名相同(规则:Java语言,根包下的 HelloWorld文件中 cMethod方法) */
JNIEXPORT void JNICALL Java_HelloWorld_cMethod(JNIEnv *env, jobject c1) {
    printf("Hello World Native!!\n");
}

6.生成jinlib库,让java调用

这里写图片描述

生成后在同目录下可以看到libHelloWorld.jnilib文件

扫描二维码关注公众号,回复: 53176 查看本文章

7.运行java代码

这里写图片描述

运行报错?这是因为java虚拟机在java.library.path没找到HelloWorldNative ,那我们就告诉java虚拟机。

这里写图片描述

VM options:-Djava.library.path=./src/

保存后再运行就正常了!

这里写图片描述

猜你喜欢

转载自blog.csdn.net/kxwinxp/article/details/80057263