IOS 使用KBMMW 访问JAVA 服务

简介: 废话少说,如何使用KBMMW 做个过渡,使IOS 可以使用JAVA 的服务? 其实KBMMW 本身就要java service 的服务,但是为了把这个问题说清楚,我手工做一个例子。   首先,要使用JAVA 服务,JRE 是肯定要安装的。

废话少说,如何使用KBMMW 做个过渡,使IOS 可以使用JAVA 的服务?

其实KBMMW 本身就要java service 的服务,但是为了把这个问题说清楚,我手工做一个例子。

 

首先,要使用JAVA 服务,JRE 是肯定要安装的。没有安装的话,自己去java.sun.com 去下载。

安装完毕, 命令行上运行 JAVA ,出现下图说明安装成功。

在服务器上首先祭起来JVM(JAVA 虚拟机)

 

function GetDllName: string;
var
  Registry: TRegistry;
  Version: string;
begin
  Result := 'jvm.dll';

  Registry := TRegistry.Create(KEY_READ);
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    if Registry.OpenKey('\SOFTWARE\JavaSoft\Java Runtime Environment', False) then
    begin
      Version := Registry.ReadString('CurrentVersion');
      if Version <> '' then
        if Registry.OpenKey(Version, False) then
          Result := Registry.ReadString('RuntimeLib');
    end;
  finally
    Registry.Free;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 I: Integer;
  WebResult,WebMessage: String;

  n,e:integer;
  VM_args:JavaVMInitArgs;
  Options:array[0..20]  of JavaVMOption;
  Methods:array [0..0] of JNINativeMethod;
  OptCnt:integer;

  j_MainClass:JClass;
  LibraryFileName:string;
  Mid: JMethodID;

  FObj,tmpobj: JObject;
  FInit : JMethodID;
 
  mypath:string;
  myclasspath:ansistring;

  Env:PJNIEnv;
  JNIEnv:TJNIEnv;

const
  classpath='.;';
  JIT=True;
begin
 if G_javavm<>nil then
   begin
      meminfo.Lines.Add('JVM already created !');
      exit;
   end;



    n:=JNI_VERSION_1_4;

    LibraryFileName:= GetDllName;

    FillChar(Options,SizeOf(Options),#0);
    OptCnt:=0;

    mypath := g_RootPath;

    myclasspath:=classpath+mypath+'ws\ws.jar';

    Options[OptCnt].optionString:=PAnsiChar('-Djava.class.path='+ myclasspath);    
    inc(OptCnt);

    if not JIT then
    begin
      Options[OptCnt].optionString:=PAnsiChar('-Djava.compiler=NONE');
      inc(OptCnt);
    end;

    VM_args.version:=n;
    VM_args.options:= @Options ;//:=    @Options;
    VM_args.nOptions:=OptCnt;
    VM_args.ignoreUnrecognized:=1;

    g_JavaVM := TJavaVM.Create(n, LibraryFileName);

    e := G_JavaVM.LoadVM(VM_args);
    if e<0 then
    begin
      meminfo.Lines.Add ('Error loading JavaVM via JNI 1.4+. ErrorCode='+inttostr(e));

      exit;
    end;

    g_JNIEnv := TJNIEnv.Create(g_JavaVM.Env);
     meminfo.Lines.Add('JVM  create ok!');


end;

当然了,文件里面必须引用 JNI 单元。这个是kbmmw 自带的(此文件原来是JEDI 翻译jni.h 得,后来kbmmw 作者修改了,可以在新版delphi 中编译);

安装完虚拟机,就可以在delphi 中使用java 的class 了

下面就是一个简单的封装java 中hashmap 的例子

 

 1  Thashmap = class
 2   private
 3     FJNIEnv: TJNIEnv;
 4     FCls: JClass;
 5     FObj: JObject;
 6     FInit: JMethodID;
 7     FPut: JMethodID;
 8     FGet: JMethodID;
 9    public
10     constructor Create(JNIEnv:TJNIEnv;createobj:boolean=True);
11     procedure  put(ID,Text: string);
12     Function   get(ID: string):string;
13     property  hashmap: jobject read FObj write FObj;
14   end;
15 { Thashmap }
16 
17 constructor Thashmap.Create(JNIEnv: TJNIEnv; createobj: boolean);
18 begin
19   inherited Create;
20   FJNIEnv:=JNIEnv;
21   if FJNIEnv=nil then
22     raise Exception.Create('Please create JNIEnv');
23 
24   FCls  := FJNIEnv.FindClass('java/util/HashMap');
25   if FCls=nil then
26     raise Exception.Create('can''t find class HashMap');
27 
28   FInit := FJNIEnv.GetMethodID(FCls, '<init>', '()V');
29   if FInit=nil then
30     raise Exception.Create('can''t find init in class HashMap');
31 
32   Fput  := FJNIEnv.GetMethodID(FCls, 'put', '(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;');
33 
34   if Fput=nil then
35     raise Exception.Create('can''t find put in class HashMap');
36 
37   Fget  := FJNIEnv.GetMethodID(FCls, 'get', '(Ljava/lang/Object;)Ljava/lang/Object;');
38 
39   if Fget=nil then
40     raise Exception.Create('can''t find get in class HashMap');
41 
42   if createobj then
43   begin
44     FObj :=FJNIEnv.NewObjectA(FCls, FInit, nil);
45 
46     if Fobj=nil then
47       raise Exception.Create('can''t create a HashMap');
48   end;
49 end;
50 
51 function Thashmap.get(ID: string): string;
52 var
53   rets:Jstring;
54 begin
55   rets:=FJNIEnv.CallObjectMethod( FObj,Fget,[FJNIEnv.StringToJString(id)]) ;
56 
57   result:=FJNIEnv.JStringToString(rets);
58 end;
59 
60 procedure Thashmap.put(ID, Text: string);
61 begin
62   FJNIEnv.CallObjectMethod( FObj,Fput,[FJNIEnv.StringToJString(id),FJNIEnv.StringToJString(text)]);
63 end;

这样你就可以在delphi 中使用hashmap 了。

         if myhashmap<>nil then
            begin
             memo1.Lines.Add('hashmap already create!!')  ;
               exit;
            end;
            myhashmap :=Thashmap.Create(JNIEnv);
            memo1.Lines.Add('HashMap create ok!!');

            myhashmap.put('ROW_ID', ROW_ID);
            myhashmap.put('BILL_ID', BILL_ID);
            myhashmap.put('AUDIT_NODE', AUDIT_NODE);
            myhashmap.put('AUDIT_STATUS', AUDIT_STATUS);
           
            memo1.Lines.Add('put all data into hashmap');
            memo1.Lines.Add('ROW_ID:'+ myhashmap.get('ROW_ID'));
            memo1.Lines.Add('FLOW_ID:'+ myhashmap.get('FLOW_ID'));

 

那么由于kbmmw 是服务器端,肯定要考虑到多线程问题。

 

那么要在kbmmw servive 里面调用java 服务就要稍微处理一下。

示例如下:

function Tmysrv.JavaHashMapCheck(ClientIdent: TkbmMWClientIdentity;
  const Args: array of Variant): Variant;
var
  I: Integer;
  ROW_ID,BILL_ID: String;
  WebResult,WebMessage: String;

  n,e:integer;

  FObj,tmpobj, errorString: JObject;

  rets:Jstring;


  myhashmap:Thashmap;
 
   Env:PJNIEnv;
   JNIEnv:TJNIEnv;

  throwable:JThrowable;
   throwableClass:JClass;

begin
         Result := '';
           ROW_ID := Args[0];
            BILL_ID := Args[1];
        G_JavaVM.JavaVM^.AttachCurrentThread(G_JavaVM.JavaVM,@Env,nil);
         try
             JNIEnv:=TJNIEnv.Create(Env);

            
            if myhashmap<>nil then
            begin
             
              Result := '0';
              exit;
            end;
            myhashmap :=Thashmap.Create(JNIEnv);
           

            myhashmap.put('ROW_ID', ROW_ID);
            myhashmap.put('BILL_ID', BILL_ID);
          
         
            result:='return='+myhashmap.get('ROW_ID');

             throwable:=JNIEnv.ExceptionOccurred();
           if throwable<>nil then
           begin
                try
                   JNIEnv.ExceptionDescribe;
                   throwableClass:=JNIEnv.GetObjectClass(throwable);
                   if throwableClass<>nil then
                   begin
                        mid:=JNIEnv.GetMethodID(throwableClass,'toString','()Ljava/lang/String;');
                        if mid<>nil then
                        begin
                             errorString:=JNIEnv.CallObjectMethod(throwable,mid,[]);
                             if errorString<>nil then
                                kbmMWRaiseException(KBMMW_ERR_SERVICE_JAVA_EXCEPTION,string(JNIEnv.JStringToString(errorString)));
                        end;
                   end;
                finally
                   JNIEnv.ExceptionClear;
                end;
           end;



        finally
              myhashmap.Free;
              myhashmap := nil;
              tmphashmap.Free;
              tmphashmap := nil;
              myObjectUtil.Free;
              myObjectUtil := nil;
              JNIEnv.Free;
              G_JavaVM.JavaVM^.DetachCurrentThread(G_JavaVM.JavaVM);
          end;
end;


剩下的就是你自己处理了。

ios 里面按照老规矩调用kbmmw 服务就行了。

 

目录
相关文章
|
9天前
|
存储 数据安全/隐私保护 开发者
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
43 8
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
|
14天前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
Java对象创建和访问
|
1月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
83 7
|
2月前
|
NoSQL JavaScript 前端开发
Java访问MongoDB
Java访问MongoDB
48 21
|
2月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
127 1
|
4月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
99 3
|
4月前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
143 2
|
5月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
123 2
|
5月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
80 1

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    48
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    43
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    43
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    124
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    29
  • 6
    iOS各个证书生成细节
    42
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    213
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    65
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    85
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    67