Androidapi.JNIBridge负责和JNI交互.,既然要交互,那么首先就是需要获得JNI的运行环境,Android本身内置的就有一个Java(Dalvik)虚拟机。所以这个第一步就肯定是要这个虚拟机和我们当前的运行线程环境关联。这时候Androidapi.JNIBridge中的TJNIResolver就出场了。GetJNIEnv这个函数就是,

  1. class function TJNIResolver.GetJNIEnv: PJNIEnv;
  2. var
  3. PActivity: PANativeActivity;
  4. begin
  5. if JNIEnvRes = nil then
  6. begin
  7. PActivity := PANativeActivity(System.DelphiActivity);
  8. PActivity^.vm^.AttachCurrentThread(PActivity^.vm, @JNIEnvRes, nil);
  9. end;
  10. Result := JNIEnvRes;
  11. end;

首先会先判定有没有附加关联到当前的运行环境,如果没有则将当前线程环境附加一个到Android的Java虚拟机中去。于是我们的程序就进入他的环境了,这个里面有一个DelphiActivity,就是以前分析的运行过程中ANdroid入口的ANativeActivity_onCreate这个由Android自己加载的函数的一个导入参数,Delphi中保存起来了,通过这个获得JVM虚拟机环境,然后附加当前线程到虚拟机。

附加进去了,那么就可以使用JNI的一些东西了。使用JNI的一些对象和数据等都是通过一个奇妙的类,这个类就是TRawVirtualClass,设计这个类的目的就是用来动态创建一些接口的实现,然后TJavaImport继承这个,然后TJavaGenericImport<C: IJavaClass; T: IJavaInstance>继承TJavaImport,通过TJavaGenericImport<C: IJavaClass; T: IJavaInstance>这个东西就可以实现对于Java的各种对象的包装,通过他的Wrap来包装一个Java对象到Delphi,然后就可以使用这些接口了。比如MainActivity就是
TJavaGenericImport<JFMXNativeActivityClass,JFMXNativeActivity>.Wrap(Syste.DelphiActivity^.clazz);
通过这个代理实现,就相当于以后我们如果要使用Java中的东西,只用写类接口JFMXNativeActivityClass和对象接口JFMXNativeActivity就可以直接通过TJavaGenericImport来转换包装获得Java对象接口了,当前前提是需要获得Java对象的数据指向。

再来看几个基本数据转换函数
function JStringToString(const JStr: JString): string;
begin
  if JStr = nil then
    Result := ''
  else
    Result:= JNIStringToString(TJNIResolver.GetJNIEnv, JNIString((JStr as ILocalObject).GetObjectID));
end;
将Java的字符串转换到Delphi中来,可见这个主要的还是通过TJNIResolver这个辅助类,获得实际JVM环境,然后通过这个来进行联系实现

 
http://blog.csdn.net/suiyunonghen/article/details/45501745

最新文章

  1. ASP.NET 截获服务器生成的将要发送到客户端的html的方法
  2. UploadHandleServlet
  3. HMM基本原理及其实现(隐马尔科夫模型)
  4. oracle java SE
  5. uploadify 后台动态传参数
  6. mysql中profile的使用
  7. 微软2017校招笔试题2 composition
  8. iOS XMPP(2)自己创建客户端
  9. Java_Activiti5_菜鸟也来学Activiti5工作流_之与Spring集成(三)
  10. 【HDU1233】还是畅通工程(MST基础题)
  11. Android安全——加固原理
  12. SpringCloud简介
  13. 常用类枚举和DATE的介绍
  14. [Go] panic 和 recover
  15. C++下的强制转换类型
  16. XMU 1246
  17. C语言Socket编程(计算机网络作业)
  18. WPF实战俄罗斯方块
  19. glBuffers &amp; glVertexPtrs
  20. MongoDB整理笔记の安全访问

热门文章

  1. poj 3100
  2. Tomcat启动失败的解决方法
  3. artdialog关闭弹出窗口
  4. Linux中的那些英文缩写和她的含义们
  5. poj 3259 (Bellman_Ford判断负环)
  6. c# 搭建服务端 常用的Helper(5)
  7. JSON.parse()的异常怎么处理;
  8. 使用sphinx索引mysql数据
  9. makefile之cmake入门
  10. css组件规范