JNI Windows 使用教程
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盘符自己搞定吧…
2,开始第一个JNI
1,JNI的原理图
直接到官方教程那里截的….
2,开始使用JNI
12345678910111213141516171819202122package
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文件
2,把.class文件转换成头文件,成功的话就会在src目录下看到.h文件了
打开后你会看到
1234567891011121314151617181920212223242526272829/* 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文件了
123456789101112131415161718//必须的头文件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文件(随便起) 没出什么提示的话就是成功的了…
4,运行我们的JNI
1,用eclipse的话,我们把编译好的dll放到项目根目录,注意不是代码根目录
12345678910//把刚才注释的地方删掉..
//这就是必须的,用来读取我们写好的C语言编译好的dll,后缀是系统自己辨认…千万不要自己写
static
{
System.loadLibrary(
"sum"
);
}
//mian方法中
//用底层c代码实现输出..呵呵~~
new
MyJni().display();
//用c计算会不会快点呢..呵呵~
System.out.println(
new
MyJni().sum(2.0, 3.0));
输出结果
貌似java本身的输出,优先级比较高??
2,补充一下:
1,我们要运行我们编译的C文件,是与我们创建的类是必须一起存在,
例如:我把MyJni.java删掉,然后另起一个Hello.java能不能直接调用dll中的方法呢?那是肯定不行的..因为,jni需要类名来进行查找
3,JNI映射的数据类型
这里内容比较多…以后用的才记录
JNI Windows 使用教程相关推荐
- 【python Windows安装教程】
python Windows安装教程 选择版本 安装 验证安装 后话 Windows安装python并不复杂,不过要切实注意的问题还是有一些的,最关键的还是关于python的版本问题以及python的 ...
- Android SDK Windows安装教程图解
Android SDK Windows安装教程图解 2011-8-29 17:16 husquan_KM 收藏 推荐 摘要: Google出的手机操作系统 Android 暴露了它的短期野心,免费 ...
- 【OpenPose-Windows】OpenPose1.4.0+VS2017+CUDA9.2+cuDNN9.2+Windows配置教程
OpenPose-Windows Configuration Tutorial In Win10_x64 最近在安排一个OpenPose相关的Project,网上大多数的教程都采用VS2015+CUD ...
- 使用U盘安装windows系统教程
使用U盘安装windows系统教程 Posted on 2016-03-28 | In Tools | | visitors 466 前言 计算机专业的童鞋们大多遇到好多需要帮 ...
- CAJViewer 8.1 Windows系统安装教程
CAJViewer 8.1 Windows安装教程 1.进入CAJViewer 官网 2.点击下载中心 3.点击Windows客户端,点击[立即下载] 4.下载成功 5 .双击下载的文件,勾选< ...
- ros2与windows入门教程-windows上安装ROS2 foxy
系列文章目录 ros2与windows入门教程-windows上安装ROS2 foxy ros2与windows入门教程-控制小乌龟 ros2与windows入门教程-监听和发布话题 ros2与win ...
- windows github教程
GitHub for Windows使用教程(一) GitHub for Windows使用教程(二) GitHub for windows使用教程(三) Github for windows使用教程 ...
- 视频教程-windows批处理教程-其他
windows批处理教程 专注游戏开发10年,软件架构师 黄棒清 ¥39.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ↓↓↓ ...
- GitHub for Windows使用教程(一)安装配置
前言 鉴于网上目前的教材都太落后,github for windows已经更新了多个版本,好多界面都发生了变化,所以来写这个教程.目的是为了帮助和我一样初学github,但是苦于找不到教程的同学,为了 ...
最新文章
- 一次失败的面试,复习一次一致性哈希算法
- 分享Leangoo敏捷工具操作视频
- spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流
- Android使用AudioRecord录制pcm音频原始数据以及使用AudioTrack播放
- Windbg新手入坑指南
- 引:善用backtrace解决大问题
- MySQL ceil()函数
- 【Win10 应用开发】自定义应用标题栏
- 最大尺寸分辨率_未来就在眼前——视涯科技推出最高分辨率硅基OLED显示屏幕...
- 浙江省2021年英语高考成绩查询,浙江高考成绩查询、志愿填报时间公布!
- html 拍照旋转了90度_华为Mate X2概念图:可旋转正反三屏幕,单颗镜头在转轴上...
- jq实现ajax访问服务器,jQuery实战读书笔记(第八章 使用 Ajax 与服务器通信)
- update.php,update php version to 5.6
- 【深度学习】使用预训练模型
- 【深度学习】基于Numpy实现的神经网络进行手写数字识别
- 飞机游戏跟踪导弹的算法[C#源码]
- 设计模式:JavaScript
- ORB-SLAM3 一张图梳理rgbd_tum.cc主流程
- latex 图片整行居中 /centering无效
- Keil4新建汇编模板工程
热门文章
- American dreams in china【中国合伙人】BT种子_马立杰_新浪博客
- 计算机电缆1*2*2.5电缆,DJYPVP2*2*2.5计算机电缆型号
- 学生成绩管理系统(C语言作业,中英文版)
- host_network_interfaces_slow_mode_thresholds
- CentOS常见命令之远程拷贝(scp)
- 钢笔墨水能否代替打印机墨水_如何避免打印机墨水偷偷跑掉
- 练字应从哪种字体练起呢?
- 图片预加载和懒加载的多种方法
- Zeek 技术介绍与应用:
- 机器学习决策树算法cart剪枝