文档详情

调用 公开 接口的 SO 的方法(安装失败了).doc

发布:2018-02-13约1.4千字共4页下载文档
文本预览下载声明
调用 公开 接口的 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。就是正在用的那个,发布不过去。
显示全部
相似文档