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 ...
随机推荐
- Day1-Python基础--数据类型
距离上次更新,已经一月有余.说明学习状态不好,且滞后严重.第二模块也滞后5周之多,可能学习方法不对,有点凌乱,导致写作业时思路还是打不开,再一个是练习的太少了吧,以后得多挤挤时间来了.目前到了这个年纪 ...
- 如何在jsp和html页面上获取当前时间
要想在JSP页面中获得当前时间并显示出来,首先得导入相关的Java包,然后创建Date对象. <%@page import="java.text.SimpleDateFormat,ja ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记六之铭文升级版
铭文一级: 整合Flume和Kafka的综合使用 avro-memory-kafka.conf avro-memory-kafka.sources = avro-sourceavro-memory-k ...
- php大文件下载支持断点续传
<?php /** php下载类,支持断点续传 * * Func: * download: 下载文件 * setSpeed: 设置下载速度 * getRange: ...
- C#重点内容之:接口(interface)(一)网络初级示例
这一篇来源于网络,简单介绍了接口的概念 接口是体现面向对象编程思想优越性的一件利器,为什么这么说呢? 首先我们来看,接口是为继承而存在的,如果没有继承,那就自然不需要接口了,既然有继承,那就需要把可能 ...
- HDU 2546 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=2546 经典的01背包 预留5元买最贵的,剩余的就是01背包. #include<stdio.h> # ...
- cocos 2dx 通过循环实现界面图形的摆放
首先创建一个一维数组 this.starSprites = new Array(); 然后知道星星的间距和坐标后通过如下代码实现位置的摆放 for(var i = 0; i < 6; i++){ ...
- DXP中插入LOGO字体方法(2)
利用字体制作软件font creator program 4.1 1.文件-->新建 2.右键---->属性 3.去掉黑框和黑底,删除即可! 4.选 工具--->导入图像,载入字体图 ...
- Android-WebView与本地HTML (Java调用--->HTML的方法)
上一篇博客 Android-WebView与本地HTML (HTML调用-->Java的方法) 介绍了 JavaScript 调用--> Java中的方法,而此篇博客是介绍 Java 调用 ...
- .net项目的mvc简单发布
基于VS2015 1. 右键要发布的项目的启动项目 2. 弹窗选择自定义,随意输入配置文件名称 3. 下一页选择FileSystem文件系统发布,同时选择将文件系统发布到本地的路径 4. 下一页,选择 ...





