• 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
  • 相关阅读:
    用Jetpack的Site Accelerator为网站CDN加速
    习惯了安逸的日子永远不知道折腾了才叫人生
    谷歌2019年最热门搜索词榜单公布
    如何隐藏WooCommerce Shop Page页面的标题
    woocommerce调用分类描述另一种方法
    修改woocommerce列表产品显示数量
    centos用手机号无法登入安全狗的解决方法
    centos安装安全狗5步就能完成
    centos安装安全狗提示Need system command 'locate' to install safedog for linux的解决方法
    yoast breadcrumb面包屑导航修改去掉product
  • 原文地址:https://www.cnblogs.com/findumars/p/5037544.html
Copyright © 2020-2023  润新知