JAVA JNI原理详细介绍及简单实例代码

发布时间 - 2026-01-10 21:53:29    点击率:

JAVA JNI原理

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:

实例:

环境说明:ubuntu 10.4.2 LTS系统

程序清单1:src/com/magc/jni/HelloWorld.java

 /**
  * 
  */
  package com.magc.jni;
 
  /**
  * @author magc
  *
  */
 public class HelloWorld {
   
   static {
     
     System.loadLibrary("Hello");
     
   }
 
   public   native void DisplayHello();
   /**
   * @param args
   */
   public static void main(String[] args) {
 
     new HelloWorld().DisplayHello();
   }
 
 }

进入src目录下,编译该JAVA类,

命令:javac ./com/magc/jni/HelloWorld.java

在该HelloWorld.java所在目录下生成HelloWorld.class

然后使用javah生成头文件,

命令:javah -jni com.magc.jni.HelloWorld

在当前目录下生成com_magc_jni_HelloWorld.h头文件,此文件供C、C++程序来引用并实现其中的函数

程序清单2:com_magc_jni_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
  /* Header for class com_magc_jni_HelloWorld */
 
 #ifndef _Included_com_magc_jni_HelloWorld
 #define _Included_com_magc_jni_HelloWorld
 #ifdef __cplusplus
 extern "C" {
 #endif
 /*
 * Class:   com_magc_jni_HelloWorld
 * Method:  DisplayHello
 * Signature: ()V
 */
 JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
  (JNIEnv *, jobject);
 
 #ifdef __cplusplus
 }
 #endif
 #endif

注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。
     2)、此头文件中的Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是将来与动态链接库交互的接口,并需要名字保持一致。

 程序清单3:src/jni_helloworldImpl.cpp

#include <jni.h>
#include "com_magc_jni_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
(JNIEnv *env, jobject obj)
{
  printf("From jni_helloworldImpl.cpp :");
  printf("Hello world ! \n");
  return;
}

此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。
编译生成动态库libHello.so,

命令:g++ -shared -I /usr/lib/jvm/java-6-openjdk/include jni_helloworldImpl.cpp -o libHello.so

成功后,便会在当前目录下生成动态链接库libHello.so文件。

有了具体实现的动态库后,就可以运行JAVA调用JNI程序类的native方法了,

命令:java -Djava.library.path=. com.magc.jni.HelloWorld

输入结果即为:From jni_helloworldImpl.cpp :Hello world !

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# JAVA  # JNI原理  # JNI原理详解  # JNI  # Java通过JNI 调用动态链接库DLL操作  # java通过jni调用opencv处理图像的方法  # Java通过调用C/C++实现的DLL动态库——JNI的方法  # JNI实现最简单的JAVA调用C/C++代码  # JAVA JNI函数的注册过程详细介绍  # Java的JNI快速入门教程(推荐)  # 从源码编译Android系统的Java类库和JNI动态库的方法  # 解析Java的JNI编程中的对象引用与内存泄漏问题  # java jni调用c函数实例分享(java调用c函数)  # 详解JNI到底是什么  # 头文件  # 目录下  # 动态链接库  # 这一  # 在此  # 不需要  # 也能  # 希望能  # 便会  # 一个重要  # 谢谢大家  # 即为  # 就可以  # 实现了  # 将来  # 总结了  # 弥补了  # args  # param  # void 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何处理和验证JSON类型的数据库字段  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Laravel如何处理CORS跨域请求?(配置示例)  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  在Oracle关闭情况下如何修改spfile的参数  如何在Windows环境下新建FTP站点并设置权限?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  奇安信“盘古石”团队突破 iOS 26.1 提权  详解vue.js组件化开发实践  如何做网站制作流程,*游戏网站怎么搭建?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Java解压缩zip - 解压缩多个文件或文件夹实例  深入理解Android中的xmlns:tools属性  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel如何与Pusher实现实时通信?(WebSocket示例)  原生JS获取元素集合的子元素宽度实例  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  如何快速搭建高效香港服务器网站?  android nfc常用标签读取总结  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Python图片处理进阶教程_Pillow滤镜与图像增强  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  教学论文网站制作软件有哪些,写论文用什么软件 ?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel如何自定义错误页面(404, 500)?(代码示例)  网页设计与网站制作内容,怎样注册网站?  Laravel distinct去重查询_Laravel Eloquent去重方法  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  香港服务器部署网站为何提示未备案?  如何基于PHP生成高效IDC网络公司建站源码?  如何用腾讯建站主机快速创建免费网站?  如何安全更换建站之星模板并保留数据?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Windows Hello人脸识别突然无法使用  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  利用JavaScript实现拖拽改变元素大小  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  C++用Dijkstra(迪杰斯特拉)算法求最短路径