Java通过JNI调用C的一个小demo
最近看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++编写的文件生成动态连接库
下面我们通过一个小案例来讲解java如何通过JNI调用C中的方法:
1. 编写java代码,代码如下:
- package com.xiaomo.jni;
- public class JNI_Test {
- public nativevoid showStr(String name);
- public nativevoid add(int a,int b);
- public nativeint combineStr(int a,int b);
- static{
- System.loadLibrary("JNI_DLL");
- }
- public staticvoid 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));
- }
- }
- 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));
- }
- }
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
- #include "com_xiaomo_jni_JNI_Test.h"
- #include
- /*
- * 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;
- }
- /* 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;
- }</stdio></jni>
/* DO NOT EDIT THIS FILE - it is machine generated */
#include #include "com_xiaomo_jni_JNI_Test.h"
#include /** 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线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)
Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...
- JAVA通过JNI调用C++动态链接库CLL(一)
简介 使用eclipse新建JAVA项目并生成.h头文件 新建项目JniDemo 新建测试类JniTest并声明一个native的方法 使用Javah命令生成native方法的声明的C/C++头文件 ...
- Java通过-jni调用c语言
Java通过-jni调用c语言 一.编写JAVA程序 二.编译h头文件 三.编写C方法实现 四.生成对象文件 五.生成动态链接库 六.执行 一.编写JAVA程序 public class TestNa ...
- java线程间通信_java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- JAVA通过JNI调用C++动态链接库CLL(二)
简介 使用Visual Studio 2017新建c++动态链接库dll项目 编写JniDemo.h中getName实现并生成DLL 编写JniDemo.h在JniDemo.c实现getName方法 ...
- springboot mybatis easyui 整合的一个小demo
springboot mybatis easyui 整合的一个小demo 这是最终完成界面 话不多说 开整! 这是项目结构 数据库 表结构和数据库 (有点乱 之前本来是个正经图书表的 = =.) /* ...
- cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法
gpu程序的一般步骤 CPU分配空间给GPU(cudaMalloc) CPU复制数据给GPU(cudaMemcpy) CPU加载kernels给GPU做计算(Kernel核: 可以理解为C/C++中的 ...
- windows环境下使用clion引入eigen库并实现一个小demo
本文仅作个人记录用,之前未接触过C++,也没有使用过clion和cmake,不喜勿喷. 首先下载clion,mingw并配置相关环境,安装cmake,这部分比较简单,没有遇到什么问题. 接下来新建一个 ...
- 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器
实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...
最新文章
- Android移动开发之【Android实战项目】textview实现文字逐字显示效果
- C/C++面试题精选
- python字典内存分析_(一)Python入门-3序列:18字典-核心底层原理-内存分析-查找值对象过程...
- python显示安装失败_关于python:安装失败并显示Requirements.txt,但可用于pip安装...
- ASP.NET SignalR增加Azure支持
- 基础知识回顾——异常处理
- 引用Nuget包Microsoft.EntityFrameworkCore.Tools.DotNet报错
- 版本控制工具SVN+Apache整合
- 解决VirtualBox错误:“FATAL:No bootable medium found!”
- 【mongodb系统学习之三】进入mongodb shell
- Dubbo场景场景配置用法详解
- struts2中页面访问action的url问题,或许很简单
- springcloud工作笔记106---eureka实现服务监控_监控服务下线_服务注册_服务续约_判断注册中心可用_监控eurekaserver启动
- 适应关键业务环境的加湿系统
- Latch free等待事件
- opengl 保留上一帧_历史上第一部长片动画,还真有点重口
- (转)你确定你的交易系统最快?
- 半监督学习和直推式学习
- python余弦函数_Python cos() 函数
- 测绘工程实验指导书 (GIS 部分)