JNI学习开始篇 基础知识 数据映射及学习资料收集
JNI学习开始篇 基础知识 数据映射及学习资料收集
JNI介绍
JNI(Java Native Interface) ,Java本地接口。
用Java去调用其他语言编写的程序,比如C或C++。
JNI作为二者连接的桥梁。
Java的跨平台本质主要是由于JVM不是跨平台的,JNI本身也不是跨平台的,即JNI是与特定平台相关的。
本地方法调用
native关键字:使用native所修饰的方法为本地方法,该方法只有声明,没有实现,表示该实现是由C/C++来提供的。
JNI本质上就是Java代码调用动态链接库的过程。
在Windows上,动态链接库就是一个dll文件;在Linux上,动态链接库是so文件。
如果在Linux上,那么调用的动态链接库文件名必须以lib开头。(Windows上无此限制。)
Java程序例子如下(来自张龙老师“深入浅出JNI第一讲”视频教程):
Java程序实例:
package com.meng.hellojni; public class HelloJNI { static // static代码块的执行时机,是在类被加载到JVM的时候 { // 告诉程序去哪里找本地方法的实现 System.loadLibrary("libHello");// 不要加后缀名,因为加载方式是系统相关的 } // 使用native关键字,说明本方法为本地方法,其实现由C/C++提供 public native void output(); public static void main(String[] args) { HelloJNI test = new HelloJNI(); test.output();// 使用native方法时,认定其实现已经提供,当做一个普通的Java方法,直接使用就可以 } }
本地代码
现在要写本地的实现。
C++代码一般由头文件和源程序文件两部分组成。
可以利用JDK中的javah工具,由Java代码生成需要的头文件。
先javac编译源文件,生成class文件,然后javah生成头文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_meng_hellojni_HelloJNI */ #ifndef _Included_com_meng_hellojni_HelloJNI #define _Included_com_meng_hellojni_HelloJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_meng_hellojni_HelloJNI * Method: output * Signature: ()V */ JNIEXPORT void JNICALL Java_com_meng_hellojni_HelloJNI_output (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
也就是说,这个工具会根据Java代码中的native声明,生成对应需要的头文件声明。
其中函数声明固定以Java开头,后面跟的是包名+类名+方法名,均以下划线分隔。
另外会加入两个参数,第一个为JNIEnv *,第二个为jobject。
在实现文件中,将头文件的函数声明拷过去,然后加上实现代码即可。
可以利用Visual Studio生成dll文件(需要include刚才生成的头文件和jni头文件(jni.h和jni_md.h)),然后把生成的dll文件放在Java程序找得到的路径下,注意程序中库和dll文件名字的对应,运行Java程序就可以调用。(本文这部分代码没有给出,有兴趣请自己实现)。
JNI数据映射
截图自电子书《Android NDK Beginner's Guide》 Chapter 3
资料收集
Oracle's JNI page for Java 6, including the JNI Specification
Best practices for using the Java Native Interface
JNI Complete tutorial with examples
Android Training: JNI Tips:
http://developer.android.com/training/articles/perf-jni.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了