JNI 学习笔记

简介: 1,先把c语言的编译环境搭建好,windows下这里使用mingw 1,mingw具体配置 配置环境变量:                           打开:“我的电脑->属性->高级->环境变量->系统变量”编辑如下系统变量:    ...

1,先把c语言的编译环境搭建好,windows下这里使用mingw

1,mingw具体配置

配置环境变量: 
                         打开:“我的电脑->属性->高级->环境变量->系统变量”编辑如下系统变量: 
                         变量名                            变量值 
                         PATH                             C:\MinGW\bin; 
                         LIBRARY_PATH                C:\MinGW\lib 
                         C_INCLUDEDE_PATH        C:\MinGW\include 
                         CPLUS_INCLUDE_PATH      C:\MinGW\include\c++\3.4.2;C:\MinGW\include\c++\3.4.2\mingw32;C:\MinGW\include\c++\3.4.2\backward;C:\MinGW\include

 

盘符自己搞定吧…

image 

 

2,开始第一个JNI

1,JNI的原理图

image

直接到官方教程那里截的….

2,开始使用JNI

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package  kg.tom;
 
public  class  MyJni {
     //使用JNI的关键字native
     //这个关键字决定我们那些方法能在我们的C文件中使用
     //只须声明,不必实现
      public  native  void  display();
      public  native  double  sum( double  x, double  y);
      
     //这个是到时候调用我们写好的C文件
     //现在用不上
     //static {
     //  System.loadLibrary("sum");
     //}
     
     
     public  static  void  main(String[] args) {
         //到时候测试用方法现在用不上
         //new MyJni().display();
         //System.out.println(new MyJni().sum(2.0, 3.0));
     }
}

 

然后,就是返回到我们的java基础了…将我们写好的类,转换成头文件

1,先把写好的类转换成.class文件

image

2,把.class文件转换成头文件,成功的话就会在src目录下看到.h文件了

 image

打开后你会看到

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class kg_tom_MyJni */
 
#ifndef _Included_kg_tom_MyJni
#define _Included_kg_tom_MyJni
#ifdef __cplusplus
extern  "C"  {
#endif
/*
  * Class:     kg_tom_MyJni
  * Method:    display
  * Signature: ()V
  */
JNIEXPORT void  JNICALL Java_kg_tom_MyJni_display
   (JNIEnv *, jobject);
 
/*
  * Class:     kg_tom_MyJni
  * Method:    sum
  * Signature: (DD)D
  */
JNIEXPORT jdouble JNICALL Java_kg_tom_MyJni_sum
   (JNIEnv *, jobject, jdouble, jdouble);
 
#ifdef __cplusplus
}
#endif
#endif

native方法名称转换详解:

英语原文 我的理解… 例子

the prefix Java_

转换后的native方法全部以Java_为前缀 Java_kg_tom_MyJni_display

a mangled fully-qualified class name

接着以类的全名标识(包名+类名) Java_kg_tom_MyJni_display
  • an underscore (“_”) separator
以下划线为分隔符(“_”) Java_kg_tom_MyJni_display
mangled method name 最后就是方法的名称 Java_kg_tom_MyJni_display
  • for overloaded native methods, two underscores (“__”) followed by the mangled argument signature
这个理解不能:直译的话就是对已经读取过的native方法,用双下划线(“__”)标注 没找到

3,就是写我们的C文件了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//必须的头文件jni.h
#include <jni.h>
//导入我们需要实现的本地方法
#include "kg_tom_MyJni.h"
#include <stdio.h>
 
JNIEXPORT void  JNICALL Java_kg_tom_MyJni_display
   (JNIEnv *env, jobject obj)
{
     printf ( "Hello World tom!!" );
     return ;
}
 
JNIEXPORT jdouble JNICALL Java_kg_tom_MyJni_sum
   (JNIEnv *env, jobject obj, jdouble a, jdouble b)
{
     return  a + b;
}

 

4,windows下编译成dll文件,linux下编译成so文件.这里只说windows下的

1,java基础

找到我们的jdk文件夹,然后打开其中的include文件夹,就会看到一些头文件,看下关键的Jni.h头文件在不在,在的话,继续,不在

自行下载一个新的jdk…

2,把C文件编译成dll文件

我们这里使用mingw….你会用VC6也可以用VC6编译…

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at   -Id:/java/include –Id:/java/include/win32   -shared -o sum.dll java_sum_native.c

命令 简单介绍
-Wall -D_JNI_IMPLEMENTATION_ 把我们的C文件编译成dll
-Wl,--kill-at   因为mingw默认是用@来进行分隔,会导致JNI机制不能读取,所以要删掉.. 
mingw官网解释
Id:/java/include –Id:/java/include/win32   导入我们用的的jni需要的头文件…盘符,文件夹自己修改
-shared -o 输出配置,第一个参数为我们输出的名字(随便起),第二个参数为我们的C文件(随便起)
   

 

image

没出什么提示的话就是成功的了…

4,运行我们的JNI

1,用eclipse的话,我们把编译好的dll放到项目根目录,注意不是代码根目录

?
1
2
3
4
5
6
7
8
9
10
//把刚才注释的地方删掉..
//这就是必须的,用来读取我们写好的C语言编译好的dll,后缀是系统自己辨认…千万不要自己写
static  {
         System.loadLibrary( "sum" );
     }
//mian方法中
//用底层c代码实现输出..呵呵~~
new  MyJni().display();
//用c计算会不会快点呢..呵呵~
System.out.println( new  MyJni().sum(2.0, 3.0));

输出结果

image

貌似java本身的输出,优先级比较高??

2,补充一下:

1,我们要运行我们编译的C文件,是与我们创建的类是必须一起存在,

例如:我把MyJni.java删掉,然后另起一个Hello.java能不能直接调用dll中的方法呢?那是肯定不行的..因为,jni需要类名来进行查找

 

相关文章
|
人工智能 并行计算 PyTorch
【Hello AI】手动安装AIACC-Inference(AIACC推理加速)Torch版
AIACC-Inference(AIACC推理加速)支持优化基于Torch框架搭建的模型,能够显著提升推理性能。本文介绍如何手动安装AIACC-Inference(AIACC推理加速)Torch版并提供示例体验推理加速效果。
|
11月前
|
运维 监控 Cloud Native
构建行业应用生态:云原生应用市场简化企业软件安装
在移动互联网时代,尽管手机应用市场为用户带来了极大的便利,但企业级软件的安装和管理仍面临诸多挑战,包括安装复杂、交付效率低、应用兼容性差等问题。为此,基于云原生技术的企业级应用市场Rainstore应运而生,旨在简化企业软件的安装和管理,提升交付效率,增强应用兼容性,支持远程管理和个性化定制,构建开放的行业应用生态,助力企业数字化转型。
构建行业应用生态:云原生应用市场简化企业软件安装
|
搜索推荐 安全 Android开发
安卓与iOS操作系统的对比分析
在移动设备市场上,安卓和iOS操作系统一直是主要竞争对手。本文将从用户界面、应用生态系统、定制化程度和安全性等方面对安卓和iOS进行对比分析,并探讨两者在不同场景下的适用性。
|
存储 关系型数据库 MySQL
实战!MySQL主从复制一键搭建脚本分享
实战!MySQL主从复制一键搭建脚本分享
211 2
|
存储 Java 开发工具
将Docker镜像文件上传到DockerHub
DockerHub 是一个由 Docker 公司运行和管理的基于云的存储库。它是一个在线存储库,Docker 镜像可以由其他用户发布和使用。有两种库:公共存储库和私有存储库。如果你是一家公司,你可以在你自己的组织内拥有一个私有存储库,而公共镜像可以被任何人使用,Dockerhub就相当于git的GitHub。
450 0
|
Unix Linux Go
Golang深入浅出之-信号(Signals)处理与优雅退出Go程序
【4月更文挑战第25天】Go语言中的信号处理关乎程序对外部事件的响应,尤其是优雅地终止进程。本文介绍了信号基础,如SIGINT、SIGTERM等常见信号,以及处理流程:注册处理器、等待信号、执行清理和优雅退出。强调了三个易错点及避免方法,并提供实战代码示例展示如何监听和响应信号。信号处理应简洁高效,确保程序健壮性和用户体验。
470 0
|
SQL 分布式计算 关系型数据库
Dataphin实现MaxCompute外表数据快速批量同步至ADB MySQL
当前大数据时代背景下,企业对数据的处理、分析和实时应用的需求日益增强。阿里云MaxCompute广泛应用于海量数据的ETL、数据分析等场景,但在将处理后的数据进一步同步至在线数据库系统,如ADB MySQL 3.0(阿里云自研的新一代云原生关系型数据库MySQL版)以支持实时查询、业务决策等需求时,可能会遇到数据迁移速度缓慢的问题。 DataphinV3.14版本支持外表导入SQL的带参调度,实现通过MaxCompute外表的方式将数据批量同步至ADB MySQL 3.0中,显著提升数据迁移的速度和效率。
736 1
|
SQL 数据可视化 关系型数据库
保姆级教程|如何可视化构建实时数仓
业务上需要实时数据分析,离线任务改造成本高?数据发生变更,难以像批处理任务那样修正?AnalyticDB for PostgreSQL 提供了真正的 Stream warehouse 解决方案,具备实时ETL、行列混合存储和高性能分析引擎,实时构建数仓。为了进一步提升上手易用性,AnalyticDB for PostgreSQL 发布了企业数据智能平台,提供可视化实时任务开发 + 实时数据洞察,让您轻松平移离线任务,使用SQL和简单配置即可完成整个实时数仓的搭建。并支持实时数据洞察,可对实时数仓任意表进行Ad-hoc查询、数据探索及图表分析,让您实时数据debug和快速进行业务洞察。
1655 2
|
弹性计算 关系型数据库 OLAP
快速上手并跑通AnalyticDB PostgreSQL版TPC-H测试
本案例介绍如何创建AnalyticDB PostgreSQL实例、生成测试数据、建表、导入数据,并跑通TPC-H查询。
|
存储 Cloud Native 关系型数据库
阿里云PolarDB、RDS获评信通院数据库Serverless认证最高“先进级”,AnalyticDB获“增强级”
在日前中国信通院组织的数据库产品能力评测中,阿里云PolarDB for MySQL、RDS MySQL数据库顺利完成了首批事务型数据库Serverless能力分级测试,获最高“先进级”评级;AnalyticDB MySQL和AnalyticDB PostgreSQL顺利完成了首个分析型数据库Serverless能力分级测试,获评“增强级”评级。
阿里云PolarDB、RDS获评信通院数据库Serverless认证最高“先进级”,AnalyticDB获“增强级”

热门文章

最新文章