zoukankan      html  css  js  c++  java
  • Delphi中Android运行和JNI交互分析

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

    [delphi] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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
  • 相关阅读:
    PYTHON ASYNCIO: FUTURE, TASK AND THE EVENT LOOP
    【Python】迭代器、生成器、yield单线程异步并发实现详解
    Python函数式编程
    利用python yielding创建协程将异步编程同步化
    Understanding Asynchronous IO With Python 3.4's Asyncio And Node.js
    MySQL视图-(视图创建,修改,删除,查看,更新数据)
    菜鸟使用MySQL存储过程and临时表,供新手参考,请高手斧正
    Mysql存储过程(六)——存储过程中使用临时表
    show processlist结果筛选
    大数据文件编辑
  • 原文地址:https://www.cnblogs.com/findumars/p/5037544.html
Copyright © 2011-2022 走看看