最近看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代码,代码如下:

[java] view plaincopy print?
  1. package com.xiaomo.jni;
  2. public class JNI_Test {
  3. public nativevoid showStr(String name);
  4. public nativevoid add(int a,int b);
  5. public nativeint combineStr(int a,int b);
  6. static{
  7. System.loadLibrary("JNI_DLL");
  8. }
  9. public staticvoid main(String[] args) throws InterruptedException {
  10. JNI_Test jni = new JNI_Test();
  11. jni.showStr("Hello!");
  12. jni.add(1, 2);
  13. Thread.sleep(5000);
  14. System.out.println(jni.combineStr(5,2));
  15. }
  16. }

[java] view plaincopy print?
  1. package com.xiaomo.jni;
  2. public class JNI_Test {
  3. public native void showStr(String name);
  4. public native void add(int a,int b);
  5. public native int combineStr(int a,int b);
  6. static{
  7. System.loadLibrary("JNI_DLL");
  8. }
  9. public static void main(String[] args) throws InterruptedException {
  10. JNI_Test jni = new JNI_Test();
  11. jni.showStr("Hello!");
  12. jni.add(1, 2);
  13. Thread.sleep(5000);
  14. System.out.println(jni.combineStr(5, 2));
  15. }
  16. }
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,并完成要实现的本地方法:

[cpp] view plaincopy print?
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include
  3. #include "com_xiaomo_jni_JNI_Test.h"
  4. #include
  5. /*
  6. * Class: com_xiaomo_jni_JNI_Test
  7. * Method: showStr
  8. * Signature: (Ljava/lang/String;)V
  9. */
  10. JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_showStr
  11. (JNIEnv * env , jobject obj, jstring str)
  12. {
  13. printf("%s\n",&str);
  14. }
  15. /*
  16. * Class: com_xiaomo_jni_JNI_Test
  17. * Method: add
  18. * Signature: (II)V
  19. */
  20. JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_add
  21. (JNIEnv * env, jobject obj, jint a, jint b)
  22. {
  23. int sum = a + b;
  24. printf("%d",sum);
  25. }
  26. JNIEXPORT jint JNICALL Java_com_xiaomo_jni_JNI_1Test_combineStr
  27. (JNIEnv * env, jobject obj, jint a, jint b)
  28. {
  29. int sum = a + b;
  30. return sum;
  31. }

[cpp] view plaincopy print?
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni h="">
  3. #include "com_xiaomo_jni_JNI_Test.h"
  4. #include <stdio h="">
  5. /*
  6. * Class:     com_xiaomo_jni_JNI_Test
  7. * Method:    showStr
  8. * Signature: (Ljava/lang/String;)V
  9. */
  10. JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_showStr
  11. (JNIEnv * env , jobject obj, jstring str)
  12. {
  13. printf("%s\n",&str);
  14. }
  15. /*
  16. * Class:     com_xiaomo_jni_JNI_Test
  17. * Method:    add
  18. * Signature: (II)V
  19. */
  20. JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_add
  21. (JNIEnv * env, jobject obj, jint a, jint b)
  22. {
  23. int sum = a + b;
  24. printf("%d",sum);
  25. }
  26. JNIEXPORT jint JNICALL Java_com_xiaomo_jni_JNI_1Test_combineStr
  27. (JNIEnv * env, jobject obj, jint a, jint b)
  28. {
  29. int sum = a + b;
  30. return sum;
  31. }</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相关推荐

  1. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  2. Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)

    Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...

  3. JAVA通过JNI调用C++动态链接库CLL(一)

    简介 使用eclipse新建JAVA项目并生成.h头文件 新建项目JniDemo 新建测试类JniTest并声明一个native的方法 使用Javah命令生成native方法的声明的C/C++头文件 ...

  4. Java通过-jni调用c语言

    Java通过-jni调用c语言 一.编写JAVA程序 二.编译h头文件 三.编写C方法实现 四.生成对象文件 五.生成动态链接库 六.执行 一.编写JAVA程序 public class TestNa ...

  5. java线程间通信_java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  6. JAVA通过JNI调用C++动态链接库CLL(二)

    简介 使用Visual Studio 2017新建c++动态链接库dll项目 编写JniDemo.h中getName实现并生成DLL 编写JniDemo.h在JniDemo.c实现getName方法 ...

  7. springboot mybatis easyui 整合的一个小demo

    springboot mybatis easyui 整合的一个小demo 这是最终完成界面 话不多说 开整! 这是项目结构 数据库 表结构和数据库 (有点乱 之前本来是个正经图书表的 = =.) /* ...

  8. cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法

    gpu程序的一般步骤 CPU分配空间给GPU(cudaMalloc) CPU复制数据给GPU(cudaMemcpy) CPU加载kernels给GPU做计算(Kernel核: 可以理解为C/C++中的 ...

  9. windows环境下使用clion引入eigen库并实现一个小demo

    本文仅作个人记录用,之前未接触过C++,也没有使用过clion和cmake,不喜勿喷. 首先下载clion,mingw并配置相关环境,安装cmake,这部分比较简单,没有遇到什么问题. 接下来新建一个 ...

  10. 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器

    实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...

最新文章

  1. Android移动开发之【Android实战项目】textview实现文字逐字显示效果
  2. C/C++面试题精选
  3. python字典内存分析_(一)Python入门-3序列:18字典-核心底层原理-内存分析-查找值对象过程...
  4. python显示安装失败_关于python:安装失败并显示Requirements.txt,但可用于pip安装...
  5. ASP.NET SignalR增加Azure支持
  6. 基础知识回顾——异常处理
  7. 引用Nuget包Microsoft.EntityFrameworkCore.Tools.DotNet报错
  8. 版本控制工具SVN+Apache整合
  9. 解决VirtualBox错误:“FATAL:No bootable medium found!”
  10. 【mongodb系统学习之三】进入mongodb shell
  11. Dubbo场景场景配置用法详解
  12. struts2中页面访问action的url问题,或许很简单
  13. springcloud工作笔记106---eureka实现服务监控_监控服务下线_服务注册_服务续约_判断注册中心可用_监控eurekaserver启动
  14. 适应关键业务环境的加湿系统
  15. Latch free等待事件
  16. opengl 保留上一帧_历史上第一部长片动画,还真有点重口
  17. (转)你确定你的交易系统最快?
  18. 半监督学习和直推式学习
  19. python余弦函数_Python cos() 函数
  20. 测绘工程实验指导书 (GIS 部分)

热门文章

  1. socket写超时c语言,设置socket超时时间
  2. 编译原理——自下而上的语法分析方法(LR分析法)
  3. 机器学习(六):特征降维和主成分分析法
  4. 1647120-04-4,c(Bua-Cpa-Thi-Val-Asn-Cys)-Pro-d-Arg-NEt2 acetate多肽
  5. Win11系统一些功能修改并不令人满意,盘点不尽人意之处
  6. Java学习 --- HTML
  7. 用Angular实现图片上传问题
  8. 慕课java工程师2020版_中国大学慕课2020Java程序设计答案大全
  9. Elasticsearch设置账号密码
  10. 路由器怎么连接台式电脑