mac java jni_Mac下Java JNI 调C

简介

JNI的实现步骤如下:

编写带有native声明的方法的Java类

使用javac命令编译编写的Java类

使用java -jni className 来生成后缀名为.h的头文件

使用其他语言(C、C++)实现本地方法

将本地方法编写的文件生成动态链接库

我们开始来编写一个简单的Java call C

1、编写含有native方法的Java类

public class HelloWorld {

public native void hello();

static {

//设置查找路径为当前项目路径

System.setProperty("java.library.path", ".");

//加载动态库的名称

System.loadLibrary("hello");

}

public static void main(String[] args) {

new HelloWorld().hello();

}

}

2、编译代码

在终端执行 : javac HelloWorld.java

这时会生成HelloWorld.class 文件

3、使用java -jni className 生成后缀名为.h的头文件

在终端执行 : java HelloWorld

这时会生成HelloWorld.h 头文件. 此文件内容不能修改。看下它的内容 :

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class HelloWorld */

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: HelloWorld

* Method: hello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloWorld_hello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

4、使用C语言实现本地方法

创建 HelloWorldImpl.c 文件

#include "jni.h"

#include "HelloWorld.h"

#include

JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){

printf("Hello World!\n");

return;

}

5、将本地方法编写的文件生成动态链接库

使用命令生成动态链接库:

gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib

libhello.jnilib 就是生成的动态链接库。但是运行这个命令报错了 :

In file included from HelloWorldImpl.c:1:

/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/jni.h:45:10: fatal error: 'jni_md.h' file not

found

#include "jni_md.h"

^

1 error generated.

提示jni_md.h这个文件找不到;我们执行下面的命令拷贝一份:

sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include

在当前目录下执行 : ls -al

drwxr-xr-x 8 pengwei.xpw staff 272 Sep 10 15:31 .

drwxr-xr-x 6 pengwei.xpw staff 204 Jan 8 2017 ..

-rw-r--r-- 1 pengwei.xpw staff 567 Sep 10 15:25 HelloWorld.class

-rw-r--r-- 1 pengwei.xpw staff 377 Sep 10 15:26 HelloWorld.h

-rw-r--r-- 1 pengwei.xpw staff 341 Sep 10 15:25 HelloWorld.java

-rw-r--r-- 1 pengwei.xpw staff 174 Sep 10 15:26 HelloWorldImpl.c

drwxr-xr-x 3 pengwei.xpw staff 102 Nov 1 2016 com

-rwxr-xr-x 1 pengwei.xpw staff 8400 Sep 10 15:31 libhello.jnilib

6、last, 执行可执行文件

终端执行 : java HelloWorld

结果:

Hello World!

写在最后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值