java jni c_JNI系列之入门Hello JNI C(一)

JNI系列文章:

一、概述

Java发展至今流行度和覆盖广度已经遍布各行各业,这依赖于它的跨平台,易于入门编写,强大的社区,带来的各种各样的框架,以及功能API库。然而还是有它的局限性,比如Java的安全性(Java容易被反编译)、性能、内存管理(成也垃圾回收,败也垃圾回收),正式程序员无法直接的管控到内存,才容易导致内存泄漏GC无法回收。为了解决这些问题使用更加高效的c/c++,于是出现了JNI(Java Native Interface)Java本地接口,便于java语言和c/c++语言的通信。

注意前方高能: 学习JNI必须有C/C++的基础,否则Native层的工程代码你会一知半解,甚至一路懵逼,严重的易导致扔鼠标、砸电脑,然后就是入门到放弃。

二、环境搭建

Java代码的编写目前使用Eclipse,C/C++的代码编写以及编译运行环境是Visual Studio + Windows 64位

首先配置Java的 jdk环境变量,这个对于一个java的老司机来说太简单了不多说。

安装好Visual Studio这个也不用说,问度娘,我的VS版本是:Visual Studio community 2015,安装包有点大,安装挺快的,也就大概一天吧,哈哈哈哈哈哈哈哈哈。

三、编码实现

Java代码

使用Eclipse创建一个普通的Java Project,然后创建一个类:JniTest

package com.jerry.jnitest;

public class JniTest{

public static void main(String[] args){

}

}

复制代码

在类中写入native的方法(就是java调用C/C++的方法)

/**

* 通过jni,获取c中返回的字符串

* @return 字符串

*/

public native static String getStringFromC();

复制代码

完整代码如下:

package com.jerry.jnitest;

public class JniTest{

public static void main(String[] args){

// 调用native方法,获取C中返回的字符串数据

String text = getStringFromC();

System.out.println(text);

}

static {

System.loadLibrary("JniStudy");

}

/**

* 通过jni,获取c中返回的字符串

* @return 字符串

*/

public native static String getStringFromC();

}

复制代码生成C中使用的native方法头文件

(如果配置好了jdk的环境变量,正常情况下不会有问题),cmd终端下输入如下命令,当前终端目录必须在java工程的src路径下:

命令:javah com.jerry.jnitest.JniTest(native方法所在类的全名)51cd097793293385bfa5c42d180bbf3d.png

一般情况生成的头文件都在src目录下。

创建C语言工程,拷贝头文件至工程目录

使用VS创建空的项目JniStudy,将头文件拷贝到JniStudy目录中d843c23875197e7b5eb9f93951793d9c.png

在VS中的解决方案里右击添加现有项把头文件添加进来:

fb067df03741d9cbc684fe465a7b7013.png

打开头文件这时候你会发现头文件的代码有红色波浪线#include 出错了,那是因为jni.h的头文件没有包含进来,这个头文件可以在JDK安装目录的include文件夹里可以找到,因为jni.h本身也引用了jni_md.h头文件,所以也要包含进来,同样可以在JDK安装目录的include下可以搜索到。

在VS中创建一个01.c的源文件用来实现头文件中的native函数:

#include "com_jerry_jnitest_JniTest.h"

JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getStringFromC

(JNIEnv *env, jclass jcls){

char *str = "Hello Jerry welcome to Jni World!";

return (*env)->NewStringUTF(env, str);

}

复制代码

这个就是实现return一个C的字符串。这样native函数就实现了,接下来就是生成动态链接库供java来调用native方法。

先将VS的编译环境改成你的系统的,我的windows 64位:

11370b9256e944e44804107aa4078103.png

c9f58dee15ce1c57be2fb675bc2a8350.png

修改编译运行的文件:

6b88bc469b546dd4c0b8036e1b38b7f0.png

接下来生成动态链接库

6da01437093ca08723a801dc46ec1638.png

生成的是windows下的dll,生成的文件在工程目录的x64/debug/jni_study.dll

36e57c62ebc7512d27515d1fc2aadd59.png

将动态链接库所在的目录配置到系统的Path环境变量里:

c0bf6adc2bbe46162a483bd53f60a0c9.png

如果你不限麻烦的话,也可以将生成的动态库拷贝到Java工程的更目录下。

环境变量配置好后,重启Eclipse

然后运行Java工程的JniTest这个类。

运行结果:

bc31212fe45adfe3966d09aa99d48518.png

看这个是main方法里调用 getStringFromC()的native方法,C工程代码返回来的字符串:Hello Jerry welcome to Jni World!

四、总结

在java工程编写native方法

使用javah 命令生成头文件

拷贝头文件到C工程,以及相应的jni.h、jni_md.h头文件

实现头文件的native方法

修改VS编译运行环境,配置项改成生成dll动态库

生成解决方案,配置dll动态库所在目录到系统环境变量

重启Eclipse,运行java工程

JNI系列文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值