96SEO 2026-07-24 12:14 1
JNI 是 Java 网站的标准编程接口,允许 Java 代码与使用其他编程语言编写的应用程序和库进行交互。
┌─────────────────────────────────────────────────────────┐
│ Java/Kotlin 层 │
│ ├─ Activity/Fragment │
│ ├─ 业务逻辑 │
│ └─ external fun nativeMethod ← 调用 Native 方法 │
└─────────────────────────────────────────────────────────┘
↓ JNI
┌─────────────────────────────────────────────────────────┐
│ JNI 接口层 │
│ ├─ JNIEnv │
│ ├─ 类型转换 │
│ └─ 方法调用 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ Native 层 │
│ ├─ 高性能计算 │
│ ├─ FFmpeg/OpenCV 等库 │
│ └─ 硬件加速 │
└─────────────────────────────────────────────────────────┘
| 使用场景 | 说明 | 示例 |
|---|---|---|
| 性能调整 | C/C++ 执行效率高,适合计算密集型任务 | 图像处理、音视频编解码 |
| 复用现有库 | 使用成熟的 C/C++ 库 | FFmpeg、OpenCV、OpenGL |
| 硬件访问 | 某些硬件只提供 C 层接口 | 相机、传感器、NFC |
| 代码保护 | Native 代码反编译难度高 | 主要算法、加密逻辑 |
. Kotlin/Java 代码 - 声明 native 方法 - 加载 Native 库 . JNI 接口层 - JNIEnv * env : JNI 环境指针 - 类型转换函数 - 调用 Java 方法 . Native 代码 - 实现 native 方法 - 调用程序库 - 性能敏感操作

// Kotlin 层声明
private external fun compressImage : Boolean
// ^^^^^^^^
// 声明此方法的实现由 Native 代码提供
关键点:
┌─────────────────────────────────────────────────────────┐
│ 步 : Kotlin 代码 │
├─────────────────────────────────────────────────────────┤
│ external fun compressImage: Boolean │
│ // 只声明,不实现 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步 :加载 Native 库 │
├─────────────────────────────────────────────────────────┤
│ System.loadLibrary │
│ // 加载 libffmpegandoridlibrary.so │
│ // dlopen 程序调用打开 .so 文件 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步 :运行时方法查找 │
├─────────────────────────────────────────────────────────┤
│ JVM 通过 JNI 命 名规范查找: │
│ Java_com_package_Class_method_name │
│
│ 在 .so 符号表中查找对应函数 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 3: C++ 实现 │
├─────────────────────────────────────────────────────────┤
│ extern "C" │
│ JNIEXPORT jboolean JNICALL │
│ Java_com_package_Class_method_name { │
│ // 具体实现代码 │
│ } │
└─────────────────────────────────────────────────────────┘
// 对比:普通方法 vs external 方法
// 普通方法 - 实现在 Kotlin 中
fun add : Int { return a + b // 代码在这里 }
// external 方法 - 实现在 Native 中
external fun compressImage : Boolean
// 代码在 C++ 中,通过 JNI 调用
JNI 函数名必须严格按照以下格式:
Java_<包名路径>_<类名>_<方法名>
示例这方面,Kotlin: com.aykon.demo.ffmpegandoridlibrary.ImageCompress.compressImageFromPath
│ │ │
└─────────┬────────┘ │ │
│ └─────────────────────┴─── 方法名
└────────────────────────────────────── 类名
JNI 函数名:
Java_com_aykon_demo_ffmpegandoridlibrary_image_ImageCompress_compressImageFromPath
│ │ │ └───────┬──────────┘ └───┬────┘ └───┬────
| | | | | └── 方法名
| | └── ────────┴ ────────┴ ──────── 方法名
| └ ──────── 类名
└ ──────── 包名
// Kotlin 代码
package com.example.myapp
class ImageProcessor { external fun processImage : Boolean }
// 对应的 C++ 函数名
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_example_myapp_ImageProcessor_processImage (
JNIEnv * env,jobject thiz,jstring path ) { // 实现 }
com.aykon.demo.ffmpegandoridlibrary
↓
com_aykon_demo_ffmpegandoridlibrary
↓ 全 部用下划线替换点号
com_aykon_demo_ffmpegandoridlibrary
// Kotlin 中允许重载
external fun process
external fun process
// JNI 会添加签名后缀
Java_..._process__3_3B // ByteArray
Java_..._process__Ljava_lang_String_2 // String
// 建 :避免重载,使用不同方法名
external fun processBytes
external fun processString
// 不使用 extern "C"
JNIEXPORT jboolean JNICALL myFunction // ❌ C++ 会修饰名称
// 符号表: _Z12myFunctionP7JNIEnv_P8_jstring
// 使用 extern "C"
extern "C" {
JNIEXPORT jboolean JNICALL myFunction // ✅ 保 持原 名
// 符号表: myFunction }
必须使用 extern "C" 的原因:
class="hljs language-bash" lang="bash">┌─────────────────────────────────────────────────────────┐ | . System.loadLibrary 调用 | ├─┬ ------------------------------------------------------- ┤ | System.loadLibrary | | | 从|内部执行来看。Runtime.getRuntime.loadLibrary | └─┬ ------------------------------------------------------- ┤
| ↓
| ┌── ------------------------------------------------------- ┐
| | .构造库文件名 |
| 至于|输入,"ffmpegandoridlibrary" |
| |添加前缀这方面,lib + name + .so |
| |按优先级搜索以下方法: |
|. System.getProperty |
|. APK 中的 lib 目录 |
| ├──lib/ arm64-v8a/libxxx.so |
|. 程序库方法 /system/lib64 |
|. 应用私有方法 /data/app/.../lib |
↓
|使用程序调用 dlopen 打开 .so 文件 |
|
| dlopen |
|- 读取 .so 文件头 |
|- 加载代码段到内存 |
|JVM扫描 .so 符号表,查找JNI函数 |
模式这方面,自动命名规范查找 | Java...methodname | | 再看模式,JNIOnLoad手动注册 | J N I E X P O R T jint J N I C A L L JN I_O n L oad { // 注册函数 | } | └── ------------------------------------------------------ - ↓
// 加载多个Native库class NativeLib {
companion object { init { // 按依赖顺序加载 System.loadLibrary // FFmpeg工具库 System.loadLibrary // FFmpeg编解码库 System.loadLibrary // FFmpeg格式库 System.loadLibrary // FFmpeg缩放库 System.loadLibrary // 主库 } }
}
至于主库,libffmpegandoridlibrary.so ├─ libavutil.so ├─ libavcodec.so ├─ libavformat.so ├─ libswscale.so
└─ libswresample.so
所有库都会打包到APK中: APK/ └─ lib/ ├─ arm64-v8a/ | ├──libffmpegandoridlibrary.so | ├──libavutil.so └── armeabi-v7a/ └──...
class="ini" lang="ini"> ┌──── ───── ───── ───── ───── ───── ───── ───── ───┐
JVM Native方法管理 |
├── ───── ───── ───── ───── ───── ───── ───┤
| |
| 已加载的 .so 库列表 |
| libffmpegandoridlibrary.so ← 主库 |
| libavutil.so |
| 方法缓存表 |
| Key: |
| methodName |
第一次调用external方法:
再看调用,stringFromJNI
再看步骤1,检查缓存Key:"NativeLib.stringFromJNIVoid"
再看结果1,未找到步骤2:
构造JNIFunctionName:
Java_com_package_NativeLib_stringFromJNIVoid
从步骤3来看,遍历已LoadedLibraries:
libmain.soxxxxxxxxxxxxxxxx!Java_com_package_NativeLib_stringFromJNIVoid
至于步骤5,存入Cache=
第二次调用同一方法: 检查Cache直接返回CachedFunctionPointerxxxxxxxxxxxxxx!
如果有多个动态链接库都实现了同名的external method System.loadLibrary System.loadLibrary System.loadLibrary A:的观点是,method B:的观点是,method 至于C:。method
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback