C++转JAVA的转换方法及约定.pdf_第1页
C++转JAVA的转换方法及约定.pdf_第2页
C++转JAVA的转换方法及约定.pdf_第3页
C++转JAVA的转换方法及约定.pdf_第4页
C++转JAVA的转换方法及约定.pdf_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 基本思想 基本思想 1 1 使对象对应使对象对应 每出现一个 C 类就写一个 JAVA 类 JAVA 类的行为完全模仿 C 类的行为 而 且要保证 C 的对象的生存期至少比 JAVA 长 而且能够保证使所有动态分配出 来的 C 对象有机会得到析构 实现的方法是在每个 JAVA 类中添加一个 int 类型的变量 ptr 参见表 2 1 中的 part4 ptr 指向该 JAVA 类所对应的 C 对象 ptr 并不在 JAVA 中使用 它只在 本地方法中通过转换成相应的 C 对象 来实现对 C 调用 请参考表 3 1 示 例 1 2 关于关于 C 对象和对象和 JAVA 对象的生存期问题的解决 对象的生存期问题的解决 对于 C 对象的生成有两种情况 1 2 1第一种情况 新的第一种情况 新的C 对象在原对象在原C 系统内部管理 在系统内部管理 在JAVA 中我们不关心它的创建和释放中我们不关心它的创建和释放 C 对象是由原系统 C 内部生成 然后返回给外部调用最后再由原 C 系 统释放 在这种情况下 我们新建一个对应的 JAVA 类 然后把这个 C 对象的 地址赋给该 JAVA 类的内部成员变量 ptr 通过带有参数 FromReturn int exestPtr 的构造函数实现 其中 FromReturn 是一个空类用于标注不要创建 C 对象 参 见表 2 1 按目前的分析 这种情况仅限于在原系统中返回值是 C 指针的情况 1 2 2第二种情况 新的第二种情况 新的C 对象在外部创建对象在外部创建 是除第一种情况之外的 动态创建和静态创建都包括 其它所有情况 1 若原 C 类提供了构造函数 则在相应的 JAVA 类中效仿 C 中的构造函 数将它改造成 JAVA 格式 然后在此 JAVA 构造函数中调用 Part3 中的服务接 口函数 该服务接口函数 JNI 在相应的本地方法中创建新的 C 对象 并将 它放进全局的对象管理类 见本条末 在 finallize 的接口服务函数 JNI 的本 地方法中释放这个 C 对象 但是 JAVA 并不保证 finallize 一定执行 我们通过 在 JNI 的本地实现中声明一个全局的对象管理类来解决 当新分配一个 C 对象 时我们把它放进这个管理类 当 finallize 执行时我们告诉这个管理类让它释放掉 这个类 最后我们在这个管理类的析构函数中释放掉所有未能被释放的 C 对 象 该类参见表 2 2 CObjectManager 类 2 若原 C 类提没有供了构造函数则我们在 JAVA 端提供一个空参数的构造 函数 示例 3 1 中的 JA 其余同 1 注 每个 JAVA 类都有 4 个部分 Part1 Part2 P art3 Part4 1 3 关于关于多态问题的解决 关于关于多态问题的解决 当 C 中的函数返回类型为基类类型的指针而实际返回的是 C 子类的对象时 相应的转到 JAVA 后也要返回的是 JAVA 基类类型但是要返回实际的 JAVA 子类 对象 这时需要在 C 端的基类中提供一个 GetType 函数在 JAVA 端根据不同的 类型返回不同的 JAVA 子对象 2 约定 约定 2 1 类名类名 JAVA 系统内类名与 C 类的类名一致 方法格式一致 2 2 关于类的创建 关于类的创建 参见 1 2 2 3 每个每个 JAVA 类都有四个部分类都有四个部分 如表如表 2 1 所示 此处以类所示 此处以类 JA 为例 为例 其中用到一个全局的类 public class FromReturn 是一个空类 用在传给 JAVA 类的构造函数的参数 用于标注不要在构造函数中 创建 C 对象 这种情况适用于在原 C 系统中返回一个类的情况 表 2 1 对 JAVA 类的约定 对 JAVA 类的约定 以类 JA 为例 共分四个部分 Parts1 和和 Part2 中的方法除中的方法除 JA FromReturn int exestPtr 这个构造函数外 其余的函数都要在这个构造函数外 其余的函数都要在 Part3 中的函数来实现 即中的函数来实现 即 Par3 为为 Part1 和和 Part2 提供服务 提供服务 而 Part3 通 过 JNI 调用本地方法 public class JA Part 1 construct 与 finallize 必须提供 protected JA FromReturn int exestPtr 所有的类必须提所有的类必须提供这个构造方法 除了类名不一样外其余部分完 ptr existPtr 全一样这个构造函数并不需要 JNI 仅供内部使用 除这个构造函数外其 isFromReturn true 它在本部分的方法都需要 JNI 该方法内容十分固定 所有类必须遵守 public JA ptr nJA isFromReturn false public synchronized finalize if isFromReturn nfinallize ptr Part 2 必须提供 与 c 中暴露的方法一至 但要对应到 JAVA 格式 public SomeClass SomeMethod 有返回 对象类型 int ptrB ptrB nSomeMethod ptr SomeClass b SomeClass new FromReturn ptrB Return b public int SomeMethod2 return nSomeMethod2 ptr 有返回 基本类型 以 int 为例 public void SomeMethod3 nSomeMethod3 ptr 无返回 以上几个示例函数只是针对在原 C 系统中没有传入参数的情况 对于在原 C 系统中有传入参数的情 况 根据 JNI 的特性直接传即可 只是对在原 C 系统中传入的参数是基本类型的引用或是基本类型的指针 指针的情况有所不同 因为这些参数有可能被改变 解决的办法是将每个参数放进容量等于 1 的数组里 再传 Part 3 访问权限一至 protected native 提供本类供 part1 和 part2 中方法调用的本地代码的声明 注意本部分不对注意本部分不对 外暴露任何东西 命名的方法是在外暴露任何东西 命名的方法是在 part1 和和 part2 暴露方法的的名字前加一个暴露方法的的名字前加一个 n 当返回的是对象或结构时 当返回的是对象或结构时 要返回它的在要返回它的在 C 中的指针 在中的指针 在 JAVA 端用端用 int 表示 每个方法声明的第一个参数都是一至的 都本类的表示 每个方法声明的第一个参数都是一至的 都本类的 prt 属性 服务于构造函数的属性 服务于构造函数的 JNI 声明除外 在本地端动态获得这个声明除外 在本地端动态获得这个 ptr 并把新分配的 并把新分配的 C 对象指针赋于它 对象指针赋于它 针对 part1 private native int nJA 注 这里没有传入注 这里没有传入 ptr 返回的值被赋给返回的值被赋给 ptr 在本地 在本地 C 端端 nJA new 一个新的一个新的 C 对象对象 并将其指针放入并将其指针放入 CObjectManager 中中 private native void nfinallize int ptr 针对 part2 在 part2 中有什么样的函数这里就有相对应的服务函数声明 private native int nSomeMethod int ptr 有返回 对象类型 private native int nSomeMethod2 int ptr 有返回 基本类型 以 int 为例 private native void nSomeMethod3 int ptr 无返回 Part 4 public int ptr 指向对应的C 对象的指针 private boolean isFromReturn 参见第 4 部分修改说明 表 2 2 本地全局管理类 CObjectManager CObjectManager class CObjectManager public Add void cppObj 添加类地址到 objs 中 Remove void cppObj 释放 cppObj 对象 并将其在 objs 中移除 CObjectManager 构造函数 初始化 objs CObjectManager 析构函数 若 objs 不空 则释放 objs 中的所有对象 并将 objs 清空 private mapobjs 键和值为同一值 3 示例示例 表 3 1 示例 JAVA JNI C public class JA Part 1 construct 与 finallize protected JA FromReturn int exestPtr ptr existPtr isFromReturn true public JA ptr nJA isFromReturn false Public synchronized finalize if isFromReturn nfinallize ptr Part 2 必须提供 与 c 中暴露的方法一 至 但要对应到 JAVA 格式 public JB GetB int ptrB ptrB nGetB ptr JB b new JB new FromReturn ptrB return b Part 3 访问权限一至 protected native 提供本类供part1和part2中方法调用的JNI 的声明注意本部分不对外暴露任何东西注意本部分不对外暴露任何东西 针对 part1 private native int nJA private native void nfinallize int ptr 针对 part2 private native int nGetB ptr Part 4 指向对应的 C 对象的指针 protected int ptr private boolean isFromReturn e x t e r n CObjectManager g om J N I E X P O R T v o i d J N I C A L L J a v a m y p a c k m y T e s t nGetB J N I E n v e n v j o b j e c t o b j j i n t j P t r A p t r A A j P t r B p t r B p t r A G e t B r e t u r n i n t p t r B 如果返回的 B对象不是指针类型而 是对象本身 在右边一栏的函数声明 类似这样 B GetB 则以上函数中 的代码应如下所示 A ptrA A jPtr B ptrB new B ptrB ptrA GetB g om Add ptrB return int ptrB 且 nfinallize 要做如下实现 JNIEXPORT void JNICALL Java mypack myTest nfinallize JNIEnv env jobject obj jint jPtr g om Remove jPtr 其它函数略 h文件 class A public B GetB cpp 文 件 B A GetB return new B 这个地方新分配了一 个对象而且返回了它的 指针 我们在 JAVA 调用 的时候不必关心它的释 放问题 因为只要我们 JAVA 端完全仿效 C 运 行流程的话 C 系统会 在自己内部释放该对象 public class JB Part 1 略 Part 2 public void TestB nTestB ptr e x t e r n CObjectManager g om J N I E X P O R T v o i d J N I C A L L J a v a m y p a c k m y T e s t nTestB J N I E n v e n v j o b j e c t o b j j i n t j P t r h文件 class B public void TestB cpp 文 件 Part 3 private native void nTestB int ptr 其它略 Part 4 protected int ptr B p t r B j P t r ptr TestB void B TestB cout this is B in C GetB 这个地方的 也可能 是 pb TestB 输出 this is B in C this is B in C 4 修改说明修改说明 1 在每个 JAVA 类的 PART4 中添加 protected Boolean isFromReturn 这个变量只在 PART1 中使用 而且在所有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论