# hty-so **Repository Path**: bbfbbf/hty-so ## Basic Information - **Project Name**: hty-so - **Description**: 使用JAN调用SO文件的示例 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2020-08-26 - **Last Updated**: 2022-05-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用JNA调用so文件 本示例有两个so文件 - ``libAdd.so``是最简单的a+b函数 - ``ZXDQMX.so`` 是一个复杂函数,有指针参数、指针数组返回、调用外部文件等 ## 文件的搜索路径 1. 可以通过设置系统属性``jna.library.path`` 2. 修改系统的库访问环境变量 3. 将库放置在classpath下,或者放在``{OS}-{ARCH}/``目录下,比如``win32-x86``,``win32-x86-64``,``linux-x86-64``,``linux-x86``,``linux-amd64``,``darwin``等。如果放在jar文件中,则会在加载时自动提取。 ### 示例 ````java public interface RunSo extends Library { RunSo INSTANCE = Native.load(GetLibraryPathHelper.GetLibPath(), RunSo.class); int add(int a, int b); class GetLibraryPathHelper { public static String GetLibPath() { return "/hty_web/libAdd.so"; } } } public interface RunSo extends Library { // libAdd.so的路径必须是resource/linux-x86-64/libAdd.so RunSo INSTANCE = Native.load("libAdd.so", RunSo.class); int add(int a, int b); } ```` ## 运行方式 1. 要求使用Ubuntu18.04以上版本(glibc > 2.27) 2. ``sudo apt-get install gfortran`` 这五个文件都放到同一个目录。 - hty-so-0.0.1-SNAPSHOT.tar.gz - dwm07b104i.dat - hwm123114.bin - libAdd.so - ZXDQMX.so ```` tar xzvf hty-so-0.0.1-SNAPSHOT.tar.gz ./hty-so-0.0.1-SNAPSHOT/bin/run ```` ## 指针的使用 ````java // 关于double指针的调用方法 void test(DoubleByReference d1, Pointer p1); // 直接使用DoubleByReference DoubleByReference p_iyr = new DoubleByReference(725D); // 使用Pointer private static final int DOUBLE_SIZE = Native.getNativeSize(Double.class); Pointer p_ihr = new Memory(DOUBLE_SIZE); p_ihr.setDouble(0, 615D); ```` ## 参数映射 Native Type | Size | Java Type | Common Windows Types ---- | ---- | ---- | ---- char | 8-bit integer | byte | BYTE, TCHAR short | 16-bit integer | short | WORD wchar_t | 16/32-bit character | char | TCHAR int | 32-bit integer | int | DWORD int | boolean value | boolean | BOOL long | 32/64-bit integer | NativeLong | LONG long long | 64-bit integer | long | __int64 float | 32-bit FP | float | double | 64-bit FP | double | char* | C string | String | LPCSTR void* | pointer | Pointer | LPVOID, HANDLE, LPXXX ## ZXDQMX.so ### 查看动态库依赖 ````shell [root@bbf ~]# ldd ZXDQMX.so linux-vdso.so.1 (0x00007ffc635e1000) libgfortran.so.4 => /usr/lib/x86_64-linux-gnu/libgfortran.so.4 (0x00007fb04e62d000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb04e28f000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb04e077000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb04dc86000) libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fb04da46000) /lib64/ld-linux-x86-64.so.2 (0x00007fb04ec24000) ```` ### 查看动态库方法 ````shell [root@bbf ~]# nm -D ZXDQMX.so | awk '{if($2=="T"){print $3}}' __alf_MOD_alfbasis __alf_MOD_initalf ambar_ ap2kp_ dwm07b_ findandopen_ _fini gd2qd_ __gd2qdc_MOD_initgd2qd grav_ hwm14_ hwmqt_ _init initdwm_ inithwm_ initqwm_ kpspl3_ latwgt2_ mltcalc_ nsmsub_ sunpos_ theta_ tlocal_ tlocal2_ vertwght_ zxdqmx_ ````