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
  • 相关阅读:
    批量改主机名报错:Address 192.168.43.117 maps to bogon, but this does not map back to the address
    ssh远程登录连接慢的解决方法
    expect脚本远程登录、远程执行命令和脚本传参简单用法
    将集群WEB节点静态数据迁移到共享存储器(LNMP环境)
    LAMP环境搭建之编译安装指南(php-5.3.27.tar.gz)
    手把手教你设置MongoDB密码
    手把手教你在Linux系统下安装MongoDB
    手把手教你在Linux系统下安装MySQL
    在Linux下使用rm -rf /*后会怎样?
    Failed to configure a DataSource 'url' attribute问题解决
  • 原文地址:https://www.cnblogs.com/findumars/p/5037544.html
Copyright © 2011-2022 走看看