博客
关于我
JNI开发流程
阅读量:777 次
发布时间:2019-03-24

本文共 1957 字,大约阅读时间需要 6 分钟。

前言:现在越来越多的Java或Android项目都使用JNI来实现本地调用功能。通过JNI,可以在Java中调用C/C++代码来提升Java运行效率。这尤其适用于耗时操作和需要高性能处理的场景。此外,JNI还能更安全地保护核心业务逻辑,避免反编译风险。接下来,我们将从JNI的基本概念到实际开发、生成库文件以及Java调用C/C++代码等内容进行详细介绍。

什么是JNI

JNI(Java Native Interface,Java本地接口)是一种协议,用于实现Java与本地代码(如C/C++)之间的通信。通过JNI,开发者可以利用本地代码的高性能和安全性来提升Java应用的效率,同时扩展Java运行时的功能。

为什么需要使用JNI

  • 单一编译的优势

    Java项目一次编译就可以运行在所有支持的平台上,而JNI则允许Java程序调用本地库,增强了程序的扩展性。

  • 扩展Java虚拟机能力

    JNI可以让Java程序调用底层操作系统的功能或驱动程序,从而实现对外部硬件、设备或系统资源的访问。

  • 提升Java运行效率

    Java本身是一种解释型语言,运行效率较低。通过将耗时操作外包给C/C++并用JNI调用,可以显著提升Java程序的性能表现。

  • 增强代码的安全性

    Java类文件的反编译风险较高,而通过JNI将核心业务逻辑移至C/C++层,既保证了代码的安全性,又避免了反编译带来的潜在风险。

  • 集成优秀的C库

    C作为传统编程语言之一,拥有丰富的开发经验和成熟的库/框架。通过JNI,可以方便地调用像ALSA、OpenGL等优秀的C库,实现更高效的功能实现。

  • JNI的开发步骤

    1. 创建Eclipse项目

    在Eclipse中新建一个Java项目,注意项目模板选择“空项目”,不要选择已有模板。将项目结构设置为“src”和“gen”,建议将源代码放在“src”目录下。

    2. 编写包含JNI的Java文件

    src目录下创建一个包名为com.fly的Java文件(如TestJni.java),注明native方法。例如:

    package com.fly;public class TestJni {    public native String getCString();    public static void main(String[] args) {        // Initialize environment    }}

    3. 生成对应的C头文件

    创建一个C项目(如Using C且包含JNI),然后在项目中添加JNI开发的依赖。针对Java文件中的getCString()方法,使用Eclipse内的C/C++开发工具生成对应的C头文件com_fly_TestJni.h。文件命名规则为“包名_类名_方法名.h”。

    4. 导入头文件到C项目中

    在C项目中添加生成的JNI头文件和JNI工具链(如jni.hjni_mk.h)。确保com_fly_TestJni.h中的#include语句正确引用,并将头文件保存到项目的头文件目录下。

    5. 编写C实现代码

    在C源文件中实现JNI接口函数:

    #include "com_fly_TestJni.h"JNIEXPORT jstring JNICALL Java_com_fly_TestJni_getCString(JNIEnv *env, jobject jobj) {    // 生成本地字符串    return (*env)->NewStringUTF(env, "这是来自C语言");}

    其中JNIEnv *env是Java环境接口的指针,包含Java运行时的各种函数和数据类型转换接口。

    6. 创建动态连接库

    在项目设置中,根据平台(Windows生成dll,Linux生成so)配置外构建,然后编译生成动态连接库文件。

    7. 在Java程序中加载动态库

    在Java程序中动态加载生成的动态连接库,并呼吸JNI方法。例如:

    System.load("path/to/libjnli library.so"); String cString = TestJni.getCString();

    注意事项

  • 环境配置:确保Java开发环境(JDK)正确安装,并添加JNI开发工具链(如sun-jni)到类路径。

  • 字符编码:在生成动态连接库时,注意字符编码问题。对于多字节字符集(如UTF-8),在Windows系统上可能需要手动设置编码。

  • 依赖管理:可使用工具如Maven或Gradle管理JNI项目依赖,确保正确引用本地库和JNI工具。

  • 通过以上步骤,开发者可以顺利实现Java与C/C++代码的调用,充分发挥两者的优势,提升应用性能和安全性。

    转载地址:http://enikk.baihongyu.com/

    你可能感兴趣的文章
    庄子:谁知南华秋水意?
    查看>>
    Thread.sleep() 和 Thread.yield() 区别
    查看>>
    Kotlin 简单优雅的高阶函数
    查看>>
    UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
    查看>>
    第14章 使用Kotlin 进行 Android 开发(2)
    查看>>
    第1讲 快速入门 《Kotlin 极简教程 》
    查看>>
    Kotlin + Spring Boot :下一代 Java 服务端开发 (视频)
    查看>>
    5G蝴蝶效应:孕育万亿级产业
    查看>>
    PPT分享 | 中国移动十大领域5G应用案例
    查看>>
    宝信软件丛力群:工业互联网赋能钢铁行业高质量发展
    查看>>
    7个国家级、省级车联网先导区详细介绍!
    查看>>
    小米等9家中企又被美“拉黑”;工信部公布81项通信行业标准;诺基亚获5G合同...
    查看>>
    79家信息技术企业,募资1600亿!科创板企业募资、市值、涨幅情况排行榜发布...
    查看>>
    官宣:湘江智能“车-站-路-云”一体化协同智慧公交解决方案来啦!
    查看>>
    【论文写作PS】两张图片合为一张,不覆盖
    查看>>
    第3.1.6章 WEB系统最佳实践 js控件之bootstrap table
    查看>>
    [OpenGL ES] VBO 顶点缓冲对象
    查看>>
    尚硅谷2019年Netty教程 零拷贝 ----目标netty---step2.10
    查看>>
    打开UltraEdit,提示文件可能不是DOS格式
    查看>>
    Event Loop详解
    查看>>