Java通过JNI调用C的一个小DEMO
来源:互联网 发布:c语言 bmp 像素值读取 编辑:程序博客网 时间:2024/04/28 10:42
最近看java源代码,发现很多方法用native修饰,那么什么是native方法呢?
简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。
JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。
JNI(Java Native Interface)的书写步骤:
1、编写带有native声明的方法的java类
2、使用javac命令编译所编写的java类
3、使用javah ?jni java类名生成扩展名为h的头文件
4、用C/C++(或者其他编程想语言)实现本地方法
5、将C/C++编写的文件生成动态连接库
1. 编写java代码,代码如下:
package com.xiaomo.jni;public class JNI_Test {public native void showStr(String name);public native void add(int a,int b);public native int combineStr(int a,int b);static{System.loadLibrary("JNI_DLL");}public static void main(String[] args) throws InterruptedException {JNI_Test jni = new JNI_Test();jni.showStr("Hello!");jni.add(1, 2);Thread.sleep(5000);System.out.println(jni.combineStr(5, 2));}}
2. 编译成.class文件,记得要配置环境变量哦,不会配置的童鞋自己去补充下课外知识吧╮(╯▽╰)╭。
3. 生成.h文件 :javah –jni com.xiaomo.jni.JNI_Test 会在JNI_Test的包目录下找到com_xiaomo_jni_JNI_Test.h文件
注意:带有package的类要返回到包的根目录才能调用javah命令,否则会找不到类文件!(在这里跌倒过╮(╯▽╰)╭)
4. 生成.dll文件
1) 打开Visual c++ 6.0,选择 文件->新建->工程(选择Win32 Dynamic-Link Library)->确定->空白的dll工程->完成。
2) 选择 工具->选项->目录(添加目录JDK安装目录下的INCLUDE和INCLUDE\WIN32两个目录)。
com_xiaomo_jni_JNI_Test.h拷贝到新建的工程文件夹中。
3) 添加源文件JNI_Test.cpp,并完成要实现的本地方法:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>#include "com_xiaomo_jni_JNI_Test.h"#include <stdio.h>/* * Class: com_xiaomo_jni_JNI_Test * Method: showStr * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_showStr (JNIEnv * env , jobject obj, jstring str){printf("%s\n",&str);}/* * Class: com_xiaomo_jni_JNI_Test * Method: add * Signature: (II)V */JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_add(JNIEnv * env, jobject obj, jint a, jint b){int sum = a + b;printf("%d",sum);}JNIEXPORT jint JNICALL Java_com_xiaomo_jni_JNI_1Test_combineStr (JNIEnv * env, jobject obj, jint a, jint b){int sum = a + b;return sum;}
5. 这样在C++工程下就生成了一个JNI_Test.dll文件(在工程下debug文件夹下)
6. 将JNI_Test.dll文件复制进JDK安装目录下的bin文件夹里,运行java com.xiaomo.jni.JNI_Test 控制台打印(乱码的问题这里就不说了,自己慢慢研究吧╮(╯▽╰)╭):
作者:伫望碧落 出处:http://blog.csdn.net/cl05300629
- Java通过JNI调用C的一个小DEMO
- Java通过JNI调用C的一个小demo
- JAVA通过JNI调用C函数Demo
- JNI小程序:Java通过JNI调用C程序
- CPP通过JNI调用JAVA函数Demo
- Java通过JNI调用C语言的方法
- Java通过JNI调用C语言的方法
- Java通过JNI调用C语言的方法
- java通过jni调用c编译的dll或so
- java通过jni调用C程序
- Java通过JNI调用C/C++函数
- Android C 通过JNI 调用JAVA
- java通过jni调用c库
- Java通过JNI调用C语言
- Java 通过 JNI 调用 C/C++ 类库
- Java通过jni调用c语言方法
- java调用spark+hdfs计算的一个小demo
- jni 的一个demo
- 找回回收站中误删的文件方法
- IOS 7.0调用Alert view 添加textfield
- cname 记录
- iOS开发中KVO的内部实现
- 程序员生存定律--目录
- Java通过JNI调用C的一个小DEMO
- 数据库关系图
- COM,OLE,ActiveX
- Spring缓存机制的理解
- 排序题目一网打尽
- 详细解析Java中抽象类和接口的区别【大赞】
- UVa 10491 - Cows and Cars
- 新技能get,山寨版批量kill mysql连接
- IT忍者神龟之端口查杀