调用 公开 接口的 SO 的方法(安装失败了).doc
文本预览下载声明
调用 公开 接口的 SO 的方法
(* ************************************************ *)
(* *)
(* 设计:爱吃猪头肉 Flying Wang 2013-12-20 *)
(* 上面的版权声明请不要移除。 *)
(* *)
(* ************************************************ *)
应群里,不知道是哪位群友的要求。分析一个叫 HT518 扫描枪参考例程 的 JAVA 代码。
发现这个 代码有如下几个特点。
给出了 SO 文件。
给出了 SO 的 JAVA 定义。
SO 文件内的函数没有加密。
用 记事本打开 SO 文件如下图。
您可以找到这些接口的 定义文本。这就是没有加密。
同一个接口可能会出现 两次。 其中一个大概是预定义,另一个才是真实的定义。
上图是只有名称的定义
上图是完整的定义。
他们的顺序不一定。
所以同一个函数,请找对位置。
上图是 JAVA 文件内的定义。
两处的定义是有差别的。
我们需要将 JAVA 的定义翻译成 DELPHI 的同时,补齐丢失的参数。
以 gpio_switch_gps_bluetooth 为例。
下面是 JAVA 版的定义
static public native void gpio_switch_gps_bluetooth(int flag);
下面是 SO 中的定义
void gpio_switch_gps_bluetooth(JNIEnv*, _jobject*, int)
这个函数比 JAVA 版多了 2 个参数。
第一个 DELPHI 的定义类型是 PJNIEnv ,几乎完全一致。
第二个是 JNIObject,含义也差不多。
如果发现其他类型,请自己耐心的找对应的 DELPHI 类型。
一般都定义在 Androidapi.Jni 中。
下面是我自己翻译的结果
const
HT518dll = libjni_gpio.so;
_PU = ;
procedure gpio_switch_gps_bluetooth(Env: PJNIEnv; Obj: JNIObject; flag: Integer) ; cdecl;
external HT518dll name _PU + gpio_switch_gps_bluetooth {$IFNDEF POSIX}delayed{$ENDIF};
注意不支持动态加载
这里告诉大家一个很不幸的消息。
很多 SO 文件的内容都看不到接口。
当然如果有 JAVA 的文件可以参考。
那么您可以试试加上 Env: PJNIEnv; Obj: JNIObject ,看看能不能用吧。
由于上述 SO 是一个硬件的东西。我无法测试。
现在我用一个叫 liaSerialPort.so 的SO 文件做测试。
现在的问题是 SO 的原始名称发布到 LIB 路径,编译过程就出错了。
换个名称,就可以边缘化过去,但是安装到机器上,偏偏少这个文件。其他文件都有了。
自己把这个文件弄好几个名称,都能发布到 LIB。就是正在用的那个,发布不过去。
显示全部