@class + 查看dylib的版本

1. otool -L,file xxx

>> otool -L /usr/local/Cellar/libftdi/1.4_2/lib/libftdi1.2.4.0.dylib 
/usr/local/Cellar/libftdi/1.4_2/lib/libftdi1.2.4.0.dylib:
	/usr/local/opt/libftdi/lib/libftdi1.2.dylib (compatibility version 2.0.0, current version 2.4.0)
	/usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)
YingXi:~ jerry.yang$ otool -L /usr/lib/libSystem.B.dylib 

>> file /usr/lib/libobjc.dylib
/usr/lib/libobjc.dylib: Mach-O universal binary with 3 architectures
/usr/lib/libobjc.dylib (for architecture i386):    Mach-O dynamically linked shared library i386
/usr/lib/libobjc.dylib (for architecture x86_64):    Mach-O 64-bit dynamically linked shared library x86_64
/usr/lib/libobjc.dylib (for architecture x86_64h):    Mach-O 64-bit dynamically linked shared library x86_64

2.<mach-o/dyld.h>中的NSVersionOfRunTimeLibrary(源代码见http://www.opensource.apple.com/source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp)

自己写个小工具,code如下:

#include <stdio.h>
#include <mach-o/dyld.h>
 
int main (int argc, char **argv)
{
  printf ("%x\n", NSVersionOfRunTimeLibrary (argv[1]));
  return 0;
}

编译好后,在终端中运行如下:

>> DYLD_INSERT_LIBRARIES=/usr/lib/libpam.2.dylib 编译生成的命令行工具 libpam.2.dylib
30000

dyld加载运行dylib的过程可参考(​​​​​​https://zhuanlan.zhihu.com/p/24875905):Source Browsericon-default.png?t=M4ADhttps://opensource.apple.com/tarballs/dyld/ 3. oc @class 关键字,一般用在.h中,效果上是一种简化的import

@class:只引用class的定义成员变量、属性。等实现文件(.m/.mm等)中真正需要的时候,才会真正查看B类中的信息。
#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;
即效果看起来是“.h文件中使用了@class xxx,而在.m文件中就要使用import引入实体”

JNA是Java Native Access的缩写,它是一个Java库,可以在Java程序中直接调用本地C/C++的动态库。使用JNA调用动态库的步骤如下: 1. 在Java代码中导入JNA库的jar包。 2. 定义一个接口,该接口中声明需要调用的C/C++函数,同时使用JNA提供的注解指定该函数的库名和函数名。 3. 使用JNA提供的Native类加载该动态库。 4. 在Java代码中调用该接口中声明的函数即可。 以下是一个简单的示例代码: ```java import com.sun.jna.Library; import com.sun.jna.Native; public interface MyDll extends Library { MyDll INSTANCE = (MyDll) Native.loadLibrary("MyDll", MyDll.class); int test(String name); } public class Main { public static void main(String[] args) { int result = MyDll.INSTANCE.test("SD发"); System.out.println(result); } } ``` 这段代码中,我们定义了一个名为MyDll的接口,其中声明了一个名为test的函数,该函数需要传入一个字符串参数,并返回一个整型值。在接口中使用了JNA提供的注解@Library来指定该函数的库名为MyDll,在@Function中指定了该函数的函数名为test。 在Main类中,我们使用JNA提供的Native.loadLibrary方法来加载MyDll动态库,然后通过调用MyDll接口中的test函数来调用该动态库中的函数。 需要注意的是,JNA只支持调用动态库(.dll/.so/.dylib文件),不支持调用静态库(.lib/.a文件)。同时,JNA需要将C/C++函数转换为Java方法,因此需要注意C/C++函数名、参数类型和返回值类型的匹配关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

auspark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值