JNI 简单例子
原文:http://www.cnblogs.com/youxilua/archive/2011/09/16/2178554.html
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需要类名来进行查找
JNI 简单例子的更多相关文章
- Hibernate4.2.4入门(一)——环境搭建和简单例子
一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- spring mvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- ko 简单例子
Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...
- mysql定时任务简单例子
mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9 如果要每30秒执行以下语句: [sql] update userinfo set endtime = now() WHE ...
- java socket编程开发简单例子 与 nio非阻塞通道
基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...
- 一个简单例子:贫血模型or领域模型
转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...
- [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select
以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...
- jsonp的简单例子
jsonp的简单例子 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
随机推荐
- python读取文件操作.CSV
#-*- encoding:utf-8 -*- import numpy as np import pandas as pd def test(): # header=0,表示文件第0行为列索引 # ...
- ArcMap等值面
先说一下题目,ArcMap中没有由栅格直接生成等值面的功能,但由栅格直接生成等值线的功能存在,可通过如下方式得到等值面: 1.提取等值线 由dem直接提取等值线:Spatial Analyst Too ...
- 读书笔记 Bioinformatics Algorithms Chapter5
Chapter5 HOW DO WE COMPARE DNA SEQUENCES Bioinformatics Algorithms-An_Active Learning Approach htt ...
- 整理mianshi2
1.性能优化相关https://www.cnblogs.com/cr330326/p/8011523.html 2.CountDownLatchjava共享锁实现原理及CountDownLatch解析 ...
- android 线程中断的处理
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4 ...
- 水池问题的lua语言算法(面试题分析:我的Twitter技术面试失败了)
twitter面试题内容 “看下面这个图片” “在这个图片里我们有不同高度的墙.这个图片由一个整数数组所代表,数组中每个数是墙的高度.上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]” “ ...
- 调用azkaban接口,upload 本地zip文件
使用azkaban部署任务,可以将job文件打成zip包,通过web页面上传. 如图 但是当我们实践CI持续化部署的时候,要实现自动的部署上线. 这时就要调用azkaban提供的api. 地址如下:h ...
- shell 命令 netstat 查看端口占用
netstat 查看 8888端口的占用情况
- 通过mybatis向数据库中插入日期数据
遇到的问题: 通过mybatis向数据库中插入日期格式数据,发现只有年月日, 没有小时分钟和秒 当你想在实体类中使用java.util.Date类型,而且还想在数据库中保存时分秒时, 解决办法: 你可 ...
- Java学习---- 数组的引用传递
1. public class ArrayRefDemo01{ public static void main(String args[]){ int temp[] = {1,3,5} ; // 利用 ...