文档章节

Java并发(一) 之 Java调用native文件

来电
 来电
发布于 07/08 19:53
字数 912
阅读 194
收藏 2

转载备注地址:

1、初始化环境介绍

1.1 环境介绍

CentOS Linux release 7.3.1611 (Core) OpenJDK 1.8

1.2 环境配置

1.2.1 OpenJDK 安装

yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

获取java home:

dirname $(readlink $(readlink $(which java)))

设置环境变量: vim /etc/profile.d/env_export.sh

在新建的文件中填写

export JAVA_HOME=上面dirname命令获取到的路径,不要jre/bin最后这段

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

1.2.2 gcc安装

yum -y install gcc

2、Java 调用 .c文件

2.1 Java测试代码

2.2 编译Java代码

1、上传代码至服务器

2、编译.class文件

3、编译.h 头文件

2.3 查看.h头文件

2.4 编写.c文件

查看自己jni.h文件和jni_md.h文件地址

jni.h 文件

jni_md.h 文件

执行: gcc -fPIC -I /usr/lib/jvm/java-1.8.0-openjdk/include -I /usr/lib/jvm/java-1.8.0-openjdk/include/linux -shared -o libJucThreadNative.so threadNew.c

导入环境变量: 动态 c库文件

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/home/thread/

执行 java com.lai.dian.JucThread

3、 .c文件回调 java

编译一个.c文件通过jni 反射调用 java

执行命令: 编译可执行文件

gcc -o threadNew threadNew.c -I /usr/lib/jvm/java-1.8.0-openjdk/include -I /usr/lib/jvm/java-1.8.0-openjdk/include/linux -L /usr/lib/jvm/java-1.8.0-openjdk/jre/lib/amd64/server -ljvm -pthread

执行文件: 编译库文件.so

gcc -fPIC -I /usr/lib/jvm/java-1.8.0-openjdk/include -I /usr/lib/jvm/java-1.8.0-openjdk/include/linux -shared -o libJucThreadNative.so threadNew.c

执行文件: 编译java文件

重新上传新的java文件,多了run方法

javac JucThread.java

步骤

Java 执行 JucThread这个类,初始化static System.loadLibrary( "JucThreadNative" );

调用Java_JucThread-start0() 这个方法,这个方法又通过jni 反射调用了run方法

4、注意事项

1、Java_com_lai_dian_JucThread_start0()方法就是你需要c程序定义的方法

2、gcc -fPIC -I /usr/lib/jvm/java-1.8.0-openjdk/include -I /usr/lib/jvm/java-1.8.0-openjdk/include/linux -shared -o libJucThreadNative.so threadNew.c 执行这个命令生成动态库的时候一定要确认下自己的OpenJdk的路径

-I /usr/lib/jvm/java-1.8.0-openjdk/include 导入 jni.h 头文件

-I /usr/lib/jvm/java-1.8.0-openjdk/include/linux 导入jni_md.h头文件

-fPIC: 选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code);这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的

-shared: Linux 下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来。使用动态链接库的优点是:程序的可执行文件更小,便于程序的模块化以及更新,同时,有效内存的使用效率更高

-o: 生成指定文件

3、export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/home/thread/

导入动态库的环境地址

4、每次修改 threadNew.c文件 需要重新编译.so文件

5、参考地址

GCC生成动态链接库(.so文件):-shared和-fPIC选项

6、总结

1、如何调用run方法?

thread -> start -> start0 ->native --> pthread_create(第三个参数是线程主体方法){ 这里是通过jni反射调用,jvm不是这样操作的}

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

2、遗留问题jvm 如何通过hotspot c++ 方法调用java ?

7、demo地址

测试demo

© 著作权归作者所有

来电
粉丝 7
博文 101
码字总数 56984
作品 0
杭州
程序员
私信 提问
Java中的native关键字

一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非jav...

摆渡者
2014/03/04
3.4K
1
java Native Method初涉

今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。 一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接...

风一样
2012/10/25
111
0
android app中使用JNI

JNI提供了一种机制,使得在Java 代码中可以使用 C/C++ 的本地层代码,这种使用主要是指在 Java 代码中调用 C/C++ 代码。这种机制为我们开启了一扇门,一扇将Java 代码与广阔的 C/C++ 本地层连...

WolfCS
2013/03/02
4.2K
1
Android 8.1 源码_核心篇(一) -- 深入研究 JNI

开篇 核心源码 关键类 路径 MediaScanner.java frameworks/base/media/java/android/media/MediaScanner.java androidmediaMediaScanner.cpp frameworks/base/media/jni/androidmediaMediaS......

DeepCoder_Marco
2018/08/28
0
0
Java OutOfMemoryError 的原因是什么,什么是Java native方法

一、Java OutOfMemoryError 的原因是什么,什么是Java native方法?转载的博文 容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。 常见的几种错误: 1.1 OutO...

Oscarfff
2015/05/15
491
0

没有更多内容

加载失败,请刷新页面

加载更多

Knowage 6.2安装部署

注意:需要正确配置JAVA_HOME和JRE_HOME还有catalina_home,否则启动的时候tomcat一闪而过,想要获得报错信息,可以打开cmd,在dos命令行运行开始命令 官网:https://www.knowage-suite.com/s...

阿伦哥-
16分钟前
4
0
c++11 左值引用和右值引用

#include <iostream>using namespace std;void Print(string& s){ cout << s;}int main(){ string s="abc"; Print(s); // OK Print("abc"); // parse error......

SibylY
18分钟前
3
0
浅谈Facade外观模式

一、前言 外观模式是一种非常简单的模式,简单到我们经常都会使用,比如对于类A和B,如果两者需要交互,经过一定的处理过程才能实现某一个具体的功能,那么我们可以将这个处理的过程定义为一...

青衣霓裳
19分钟前
3
0
AnalyticDB for PostgreSQL 6.0 新特性介绍

阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务ACID。ADB PG通过行存储、列存...

Mr_zebra
21分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部