在android studio使用SO文件时需要注意的问题

在JNI(Java Native Interface)中,如果要想使用一个别人提供好的.so文件(动态链接库),必须要知道知道源文件的 函数名,返回值类型,和传入参数的类型,

那么在Java文件中调用这些本地函数时,必须对Native方法进行声明,而且声明的文件必须确保Java中的类和方法签名与C/C++源文件中定义的完全一致。这包括包名、类名、方法名和参数类型。如果不匹配,Java虚拟机(JVM)将无法找到并调用正确的本地方法,导致程序抛出UnsatisfiedLinkError

也就是说整个工程的包名必须要和.so生成之前的源文件的包名保持一致

把函数声明完之后就可以新建实例进行调用函数进行使用了。

原理解释

JNI是一种机制,允许Java代码和其他语言(如C和C++)编写的代码进行交互。当Java代码调用一个本地方法时,JVM需要通过JNI找到对应的C/C++函数并调用它。这个过程涉及到几个关键步骤:

  1. 命名约定

    • JNI使用特定的命名约定来生成C/C++中函数的名称。这个名称由Java的包名、类名和方法名组合而成,它们通过下划线(_)连接,并且全部转换为小写。例如,如果Java中有如下方法:
       

      java

      package com.example;
      public class MyClass {
          public native void myMethod();
      }
      那么JNI生成的C/C++函数名将是Java_com_example_MyClass_myMethod
  2. 加载库

    • 在Java代码中,使用System.loadLibrary("libraryName")来加载.so文件。这里的libraryName是不带lib前缀和.so后缀的库名。
  3. 查找和调用函数

    • JVM使用JNI生成的函数名来查找.so文件中对应的C/C++函数。如果Java中的类或方法名与C/C++中的不匹配,JVM将无法找到正确的函数,导致调用失败。
  4. 数据类型映射

    • JNI还负责在Java和C/C++之间进行数据类型映射。例如,Java中的int对应C/C++中的jintString对应jstring等。

为什么需要匹配

  • 唯一性:JNI生成的函数名是唯一的,它依赖于Java的包名、类名和方法名。这种唯一性确保了JVM可以准确地找到并调用正确的本地方法。

  • 安全性:通过确保Java和C/C++之间的签名完全匹配,JNI可以防止类型不匹配和潜在的安全问题。

  • 兼容性:这种机制确保了不同语言编写的代码可以无缝集成,同时保持代码的清晰和可维护性。

因此,为了成功调用.so文件中的本地方法,Java工程中的包名、类名和方法名必须与C/C++源文件中的定义完全一致。这是JNI工作方式的基本要求,也是确保Java和本地代码正确交互的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值