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
12345678910111213141516171819202122packagekg.tom;publicclassMyJni {//使用JNI的关键字native//这个关键字决定我们那些方法能在我们的C文件中使用//只须声明,不必实现publicnativevoiddisplay();publicnativedoublesum(doublex,doubley);//这个是到时候调用我们写好的C文件//现在用不上//static {// System.loadLibrary("sum");//}publicstaticvoidmain(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 __cplusplusextern"C"{#endif/** Class: kg_tom_MyJni* Method: display* Signature: ()V*/JNIEXPORTvoidJNICALL 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#endifnative方法名称转换详解:
英语原文 我的理解… 例子 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>JNIEXPORTvoidJNICALL 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){returna + 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代码实现输出..呵呵~~newMyJni().display();//用c计算会不会快点呢..呵呵~System.out.println(newMyJni().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 ...
随机推荐
- 【1】C#文件操作之目录操作
命名空间:System.IO Directory类下的静态方法: 一.创建目录 Directory.CreateDirectory(string fileName); 二.获取指定目录下的所有文件名 ...
- day22(过滤器Filter)
过滤器 生命周期:初始化 -----过滤-------销毁 作用:过滤url ,特定字符 创建方式:实现一个接口继承Filter package com.baidu.filter; import ja ...
- day21(Listener监听器)
监听器只要分为监听web对象创建与销毁,监听属性变化,感知监听器. 1.监听web对象的创建与销毁 servletContextListener 监听ServletContext对象的创建和销毁 ...
- Qt_HelloWrold
新建工程 -> 选择Qt Gui 应用 然后点击选择 在弹出的对话框中填写名称,创建路径等信息: 点击下一步,选择该工程的编译器. 点击下一步,可以选择生成的主窗口文件.不过这里我们仅仅用简单的 ...
- spring-事件通知实现
ok,今天不知道看啥来着,突然想起来spring内部的事件通知的实现,其实比较简单,简要记一下.然后又回顾了下eventbus的实现,其实俩者的实现方式大同小异吧,只是spring的很多操作都可以直接 ...
- Hdu1205 吃糖果 2017-06-29 14:26 24人阅读 评论(0) 收藏
吃糖果 Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另 ...
- lca tarjin
这个算法 我个人认为是 遍历每一个点把它当成一些询问的最近祖先 1 2 3 4 5 6 low是并差集,vis是是否访问过,访问过为true,没有为false: 假设询问是(4,4),(4,5), ...
- Codeforces Round #265 (Div. 2) D. Restore Cube 立方体判断
http://codeforces.com/contest/465/problem/D 给定8个点坐标,对于每个点来说,可以随意交换x,y,z坐标的数值.问说8个点是否可以组成立方体. 暴力枚举即可, ...
- AngularJS 过滤器 Filter
过滤器实质是数据转换或过滤,把ViewMode中的数据转化成View层用户友好的信息.可以看做一个函数,负责接收输入,转换成输出,每次参数变化时,它就被执行,输出被视图View使用. 一.基本定义及其 ...
- Python自动化开发 - Django基础
本节内容 一.什么是web框架 二.MVC和MTV视图 三.Django基本命令 四.路由配置系统 五.编写视图 六.Template 七.ORM 一.什么是web框架 对于所有的web应用,本质上其 ...





