java中native方法的使用
在非常多情况下,java须要调用其它语言的代码,比方c的代码。那么这个时候java中native方法就发挥作用了。以下就介绍native方法的使用。
一、JNI使用流程
a.编写带有native声明的方法的Java类
b.使用javac命令编译编写的Java类
c.使用java -jni ****来生成后缀名为.h的头文件
d.使用其它语言(C、C++)实现本地方法
e.将本地方法编写的文件生成动态链接库
二、实践
1、编写类代码
package com.sunny.demo;
public class Demo01 {
public native void hello();//没有实现
static{
System.loadLibrary("hello");//在类载入的 时候载入dll
}
public static void main(String[] args){
new Demo01().hello();
}
}
2、编译
javac com/sunny/demo/Demo01.java(注意,我这里是带包编译)
3、生成.h文件
javah -jni com.sunny.demo.Demo01(注意。头文件生成文件夹的位置。不知.java文件的位置,而在和包同级文件夹中,这里生成的文件名称为com_sunny_demo_Demo01.h)
4、用c实现hello方法(vc++6.0新建dllproject)
(1)当中com_sunny_demo_Demo01.h中代码例如以下(javah自己主动生成的)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_sunny_demo_Demo01 */ #ifndef _Included_com_sunny_demo_Demo01
#define _Included_com_sunny_demo_Demo01
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_sunny_demo_Demo01
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_sunny_demo_Demo01_hello
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif
(2).c文件,实现hello方法
#include<stdio.h>
#include"hello.h"
JNIEXPORT void JNICALL Java_com_sunny_demo_Demo01_hello(JNIEnv * a, jobject b){
printf("hello world");
}
(3)用VC++6.0编译一下在debug文件夹中就生成好了dll文件。
说明:编译时假设产生例如以下错误:fatal error C1083: Cannot open include file: 'jni.h': No such file or directory。说明没有找到jni.h。到jdk的安装文件夹 include/jni.h;win32/jni_md.h;win32/jawt_md.h这3个文件复制到vc的安装文件夹include中
5.将dll放到生成.h的那一集文件夹中。执行java com.sunny.demo.Demo01就会出现例如以下结果
三、总结:
上面的样例中,我是带包编译的,所以文件存放和生成的位置一定要注意,在java层面我们仅仅须要dll文件,.h和.cd 文件的目的仅仅是为了生成dll文件.最后给出我代码的文件夹结果
.h文件是javah生成的,dll文件是应该放的位置(假设不放在这个位置。执行报错,找不到hello这个库)
dll參考文章:http://www.cnblogs.com/chio/archive/2007/11/03/948480.html
external c :http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html
java native文章: http://blog.163.com/yueyemaitian@126/blog/static/21475796200701491621267
java中native方法的使用的更多相关文章
- JAVA中native方法调用
在Java中native是关键字.它一般在本地声明,异地用C和C++来实现.它的声明有几点要注意:1)native与访问控制符前后的关系不受限制.2)必须在返回类型之前.3)它一般为非抽象类方法.4) ...
- 认识理解Java中native方法(本地方法)
Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能. 可 ...
- Java中native关键字
Java中native关键字 标签: Java 2016-08-17 11:44 54551人阅读 评论(0) 顶(23453) 收藏(33546) 今日在hibernate源代码中遇到了nati ...
- Java中Native关键字的作用
初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: 1 public native int hashCode(); 为什么有个native呢?这是我所要学 ...
- Java中的方法应用
一.如何定义java中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 语法: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.priv ...
- c#和java中的方法覆盖——virtual、override、new
多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实 ...
- Java中的方法(形参及实参)return返回类型
如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...
- java中的方法method
java中的方法必须存在于类class里,不能独立存在.类是描述具有某种特征的事物,方法则是这类 事物具有的某种功能,通过调用方法可以实现某种特定的功能.方法名一般以小写的动词开头. 例: publi ...
- Java09-java语法基础(八)java中的方法
Java09-java语法基础(八)java中的方法 一.方法(函数/过程):是一个程序块,可以完成某种功能 1.java中方法的定义格式 [访问控制修饰符] 返回值类型 方法名(参数列表){ 方 ...
随机推荐
- jQuery文档处理(增加与删除文档)
1.追加内容
- ping(NOIP模拟赛Round 4)第一次程序Rank 1!撒花庆祝!~\(≧▽≦)/~
题目: 恩,就是裸的字符串处理啦. 连标程都打的是暴力(随机数据太水啦!吐槽.) 本来O(n^2q)TLE好吧.. 然后我发明了一种神奇的算法,随机数据跑的很快!,当然最坏复杂度跟标程一样啦. 不过期 ...
- VC版本与VS版本 对照表
Microsoft Visual Studio 6.0 VC6.0 Microsoft Visual Studio .NET 2002: VC7.0 ...
- vmware上搭建kickstart 网络安装centos6.2的过程
前言 什么是PXE? PXE(Pre-boot Execution Environment,预启动执行环境)协议使计算机可以通过网络启动.协议分client和server. PXE client 在网 ...
- python bisect模块二分法查找
#!/usr/bin/env python # encoding: utf-8 import bisect import sys #将一个元素插入到一个有序列表的合适位置 #使用这个模块的函数前先确保 ...
- UVALive 3507:Keep the Customer Satisfied(贪心 Grade C)
VJ题目链接 题意: 知道n(n <= 8e6)个工作的完成所需时间q和截止时间d,你一次只能做一个工作.问最多能做多少工作? 思路: 首先很像贪心.观察发现如下两个贪心性质: 1)一定存在一个 ...
- c语言自动对齐原则
转载一篇博客: http://blog.csdn.net/hairetz/article/details/4084088 1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员, ...
- POJ 3225.Help with Intervals-线段树(成段替换、区间异或、简单hash)
POJ3225.Help with Intervals 这个题就是对区间的各种操作,感觉这道题写的一点意思都没有,写到后面都不想写了,而且更神奇的是,自己的编译器连结果都输不出来,但是交上就过了,也是 ...
- HDU 2553 N皇后问题(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...
- Python_Tips[3] -> sort/sorted 排序函数
排序函数 / Sort Function list自带的sort函数可以实现对列表的排列功能,具有同样功能的还有sorted函数. 基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址 ...