精华内容
下载资源
问答
  • 一、将已经编译后的java中Class文件进行打包;打包命令JAR(或者直接使用eclipse打包比较方便)如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar...

    一、将已经编译后的java中Class文件进行打包;打包命令JAR(或者直接使用eclipse打包比较方便)

    如:将某目录下的所有class文件夹全部进行打包处理;

    使用的命令:jar cvf test.jar -C com/ .

    其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的文件夹,该文件夹包括子文件夹及class文件;

    二、到IKVM官方网站下载IKVM需要的组件  http://www.ikvm.net/

    ikvm-0.42.0.3.zipikvmbin-0.42.0.3.zipopenjdk6-b16-stripped.zip

    三、设置路径

    解压ikvm-0.42.0.3.zip,并将%IKVM_HOME%/bin添加到path中。此处的%IKVM_HOME%是指解压后ikvm的主目录。

    四、将java的jar包转换为.dll控件

    使用的命令:ikvmc -out:IKVM.dll test.jar

    其中IKVM.dll为将要生成的.dll控件文件名;test.jar为之前打包好的jar包文件。

    五、在C#项目中添加所需的控件

    1、新建一个C#.NET项目,首先添加一下必须的DLLs

    %IKVM_HOME%/bin/IKVM.OpenJDK.Core.dll%IKVM_HOME%/bin/IKVM.Runtime.dll%IKVM_HOME%/bin/IKVM.Runtime.JNI.dll

    2、添加已生成的.dll文件

    将之前生成好的.dll文件加载到C#项目中

    六、测试

    在C#项目中使用java类,其方法同java。但对包的引用使用C#的语法using

    源代码:

    Java源代码:

    packagecom.zht;//要调用的Java类

    public classTest {//要调用的Java方法

    publicString returnString() {return "Hello, zht!";

    }

    }

    C#窗体源代码:

    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingcom.zht;namespaceKIVMTest

    {public partial classForm1 : Form

    {publicForm1()

    {

    InitializeComponent();

    }private void Form1_Load(objectsender, EventArgs e)

    {

    Test t= newTest();string str =t.returnString();

    MessageBox.Show(str);

    }

    }

    }

    结果:

    启动C#窗口后,显示提示窗口,内容为:Hello, zht!

    展开全文
  • 本文背景:Delphi XE10.3 RIO由于FMX的JNIBridge将init作为默认的JAVA对象构造函数名,JAR中如果有方法名为init的类方法,FMX都会映射为构成函数,造成调用失败。这一问题需要官方修改Androidapi.JNIBridge单元的...

    本文背景:Delphi XE10.3 RIO

    由于FMX的JNIBridge将init作为默认的JAVA对象构造函数名,JAR中如果有方法名为init的类方法,FMX都会映射为构成函数,造成调用失败。这一问题需要官方修改Androidapi.JNIBridge单元的MethodIDFor方法逻辑,这里给出一个临时的Fix方法。

    unit TU2Helper.Android;

    interface

    uses System.TypInfo;

    procedure TU2FixJavaClassInit(const CTypeInfo: PTypeInfo; const ClsID: Pointer);

    implementation

    uses System.Rtti, System.SysUtils, System.Generics.Collections,

    Androidapi.Jni, Androidapi.JNIMarshal, Androidapi.JNIBridge;

    procedure GetMethodsInVTableOrder(const RttiType: TRttiType; const Methods:TList); overload;

    var

    BaseType: TRttiType;

    Method: TRttiMethod;

    begin

    BaseType := RttiType.BaseType;

    if BaseType <> nil then

    GetMethodsInVTableOrder(BaseType, Methods);

    for Method in RttiType.GetDeclaredMethods do

    Methods.Add(Method);

    end;

    function TU2GetMethodsInVTableOrder(const CTypeInfo: PTypeInfo): TList;

    var

    Context: TRttiContext;

    RttiType: TRttiType;

    begin

    Result := nil;

    Context := TRttiContext.Create;

    try

    RttiType := Context.GetType(CTypeInfo);

    if RttiType <> nil then

    begin

    Result := TList.Create;

    GetMethodsInVTableOrder(RttiType, Result);

    end;

    finally

    Context.Free;

    end;

    end;

    function MangleType(const AType: TRttiType): string; forward;

    function MangleGenericType(const AType: TRttiType): string;

    var

    BaseName: string;

    Context: TRttiContext;

    ArrType: TRttiType;

    begin

    BaseName := AType.ToString;

    BaseName := BaseName.Substring(BaseName.IndexOf('

    BaseName := BaseName.Substring(0, BaseName.IndexOf('>'));

    Result := BaseName;

    Context := TRttiContext.Create;

    try

    ArrType := Context.FindType(BaseName);

    if ArrType = nil then

    ArrType := Context.GetType(TRegTypes.GetType(BaseName));

    Result := '[' + MangleType(ArrType);

    finally

    Context.Free;

    end;

    end;

    function MangleType(const AType: TRttiType): string;

    var

    Attrs: TArray;

    SigAttr: JavaSignatureAttribute;

    OrdType: TRttiOrdinalType;

    begin

    Result := '';

    case AType.TypeKind of

    tkEnumeration: Result := 'Z'; // Boolean type

    tkWChar: Result := 'C';

    tkInteger:

    begin

    if AType.IsOrdinal then

    begin

    OrdType := AType.AsOrdinal;

    case OrdType.OrdType of

    otSWord, otUWord: Result := 'S';

    otUByte, otSByte: Result := 'B';

    otSLong, otULong: Result := 'I';

    end

    end

    else

    Result := 'I';

    end;

    tkInt64: Result := 'J';

    tkClass:  // We use tkClass to detect array types

    Result := MangleGenericType(AType);

    tkInterface:

    begin

    Attrs := AType.GetAttributes;  // We need the class signature

    if Length(Attrs) > 0 then

    begin

    SigAttr := JavaSignatureAttribute(Attrs[0]);

    Result := 'L' + SigAttr.Signature + ';';

    end;

    end;

    tkFloat:

    begin

    case TRttiFloatType(AType).FloatType of

    ftSingle: Result := 'F';

    ftDouble: Result := 'D';

    end

    end

    end;

    end;

    function TU2GetMethodSignature(const Method: TRttiMethod): string;

    var

    Param: TRttiParameter;

    begin

    Result := '(';

    for Param in Method.GetParameters do

    Result := Result + MangleType(Param.ParamType);

    Result := Result + ')';

    if Method.ReturnType <> nil then

    Result := Result + MangleType(Method.ReturnType)

    else

    Result := Result + 'V';

    end;

    type

    TOpenVTableCache = class(TVTableCache);

    TOpenJavaVTable = class(TRawVTable)

    private

    FMethodInfoData: TArray;

    end;

    procedure TU2FixJavaClassInit(const CTypeInfo: PTypeInfo; const ClsID: Pointer);

    var

    JVT: TJavaVTable;

    pMID: PJNIMethodInvokeData;

    cnt, i: Integer;

    lMethods: TList;

    lMethod: TRttiMethod;

    MethodSig: string;

    begin

    JVT := TOpenVTableCache.GetVTable(CTypeInfo, ClsID, True);

    cnt := Length(TOpenJavaVTable(JVT).FMethodInfoData);

    if cnt>0 then

    begin

    lMethods := nil;

    pMID := @TOpenJavaVTable(JVT).FMethodInfoData[0];

    for I := 0 to cnt-1 do

    begin

    if (pMID.MethodID=nil) and (pMID.MethodType=mkClassMethod) then

    begin

    if lMethods=nil then

    begin

    lMethods := TU2GetMethodsInVTableOrder(CTypeInfo);

    if lMethods.Count<>cnt then

    raise Exception.Create('Something is wrong');

    end;

    lMethod := lMethods[i];

    if lMethod.Name<>DefaultJConstructorName then

    raise Exception.Create('Something is wrong');

    MethodSig := TU2GetMethodSignature(lMethod);

    pMID.MethodID := TJNIResolver.GetJavaStaticMethodID(ClsID, DefaultJConstructorName, MethodSig);

    end;

    Inc(pMID);

    end;

    end;

    end;

    end.

    使用上只需对jar中含有init方法的类执行一遍该方法即可修复JNI的方法调用信息表。

    创建一个测试jar:

    package com.tu2.fmx.libtu2;

    public class MyClass {

    public int mId;

    public MyClass(){

    mId = -100;  //无参构造函数

    }

    public MyClass(final int id){

    mId = -id;  //构造函数

    }

    public void init(){

    mId = 100;  //对象无参init方法

    }

    public void init(final int id){

    mId = id;  //对象init方法

    }

    public static void init(final MyClass obj){

    obj.mId = 10000;  //类init方法

    }

    public static void init(final MyClass obj, final int id){

    obj.mId = 10000+id;  //类init方法

    }

    }

    MyClass接口声明单元:

    unit libtu2.MyClass;

    interface

    uses Androidapi.JNIBridge, Androidapi.JNI.JavaTypes;

    type

    [JavaSignature('com/tu2/fmx/libtu2/MyClass')]

    JMyClass = interface(JObject)

    ['{65383CE1-0BCF-4772-B95A-D1C110D95A47}']

    function _GetmId: Integer; //I

    procedure _SetmId(amId: Integer); //(I)V

    procedure init; cdecl; overload; //()V

    procedure init(id: Integer); cdecl; overload; //(I)V

    property mId: Integer read _GetmId write _SetmId;

    end;

    JMyClassClass = interface(JObjectClass)

    ['{8D808E82-FCC3-4447-80D9-8D5606FEA5D5}']

    {class} function init: JMyClass; cdecl; overload; //()V

    {class} function init(id: Integer): JMyClass; cdecl; overload; //(I)V

    {class} procedure init(P1: JMyClass); cdecl; overload; //(Lcom/tu2/fmx/libtu2/MyClass;)V

    {class} procedure init(id: JMyClass; P2: Integer); cdecl; overload; //(Lcom/tu2/fmx/libtu2/MyClass;I)V

    end;

    TJMyClass = class(TJavaGenericImport) end;

    implementation

    end.

    测试调用:

    var

    myObj: JMyClass;

    procedure TForm2.Button1Click(Sender: TObject);

    begin

    myObj := TJMyClass.Create;  //映射到无参构造函数

    memo1.lines.Add('创建对象:'+myObj.mId.ToString);

    end;

    procedure TForm2.Button2Click(Sender: TObject);

    begin

    myObj.init;

    memo1.lines.Add('对象方法Init()设置ID:'+myObj.mId.ToString);

    myObj.init(50);

    memo1.lines.Add('对象方法Init(50)设置ID:'+myObj.mId.ToString);

    //方法名为init的对象方法都可以正常调用

    end;

    procedure TForm2.Button3Click(Sender: TObject);

    begin

    try

    myObj := TJMyClass.JavaClass.init(50);

    memo1.lines.Add('类构造方法Init(50)创建新对象:'+myObj.mId.ToString);

    //两个类方法init都不能直接call

    TJMyClass.JavaClass.init(myObj);

    TJMyClass.JavaClass.init(myObj, 500);

    except

    on E: Exception do

    memo1.lines.Add('异常:'+E.Message);

    end;

    end;

    procedure TForm2.Button4Click(Sender: TObject);

    begin

    try

    //TJMyClass.JavaClass;

    TU2FixJavaClassInit(TypeInfo(JMyClassClass), TJMyClass.GetClsID);

    //现在两个类方法init都能直接call

    TJMyClass.JavaClass.init(myObj);

    memo1.lines.Add('类方法Init设置ID:'+myObj.mId.ToString);

    TJMyClass.JavaClass.init(myObj, 500);

    memo1.lines.Add('类方法Init(500)设置ID:'+myObj.mId.ToString);

    except

    on E: Exception do

    memo1.lines.Add('异常:'+E.Message);

    end;

    end;

    测试结果:

    80f9a4009a917cb72868dfdfc7ebd452.png

    展开全文
  • 一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的...

    一、将已经编译后的java中Class文件进行打包;打包命令JAR

    如:将某目录下的所有class文件夹全部进行打包处理;

    使用的命令:jar cvf test.jar -C com/ .

    其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的文件夹,该文件夹包括子文件夹及class文件;

    二、到IKVM官方网站下载IKVM需要的组件

    ikvm-0.42.0.3.zip

    ikvmbin-0.42.0.3.zip

    openjdk6-b16-stripped.zip

    三、设置路径

    解压 ikvm-0.42.0.3.zip,并将 %IKVM_HOME%/bin 添加到 path 中。此处的 %IKVM_HOME% 是指解压后 ikvm 的主目录。

    四、将java的jar包转换为.dll控件

    使用的命令:ikvmc -out:test.dll test.jar

    其中 test.dll 为将要生成的 .dll 控件文件名;test.jar 为之前打包好的jar包文件。

    五、在C#项目中添加所需的控件

    1、新建一个C#.NET项目,首先添加一下必须的DLLs

    %IKVM_HOME%/bin/IKVM.OpenJDK.Core.dll

    %IKVM_HOME%/bin/IKVM.Runtime.dll

    %IKVM_HOME%/bin/IKVM.Runtime.JNI.dll

    2、添加已生成的.dll文件

    将之前生成好的.dll文件加载到C#项目中

    六、测试

    在C#项目中使用java类,其方法同java。但对包的引用使用C#的语法using

    Java源代码:

    package com.zht;

    //要调用的Java类

    public class Test {

    //要调用的Java方法

    public String returnString() {

    return "Hello, zht!";

    }

    }

    C#窗体源代码:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

    using com.zht;

    namespace KIVMTest

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)

    {

    Test t = new Test();

    string str = t.returnString();

    MessageBox.Show(str);

    }

    }

    }

    结果:

    启动C#窗口后,显示提示窗口,内容为:Hello, zht!

    展开全文
  • 一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的...

    一、将已经编译后的java中Class文件进行打包;打包命令JAR

    如:将某目录下的所有class文件夹全部进行打包处理;

    使用的命令:jar cvf test.jar -C com/ .

    其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的文件夹,该文件夹包括子文件夹及class文件;

    二、到IKVM官方网站下载IKVM需要的组件  http://www.ikvm.net/

    ikvm-0.42.0.3.zip

    ikvmbin-0.42.0.3.zip

    openjdk6-b16-stripped.zip

    三、设置路径

    解压ikvm-0.42.0.3.zip,并将%IKVM_HOME%/bin添加到path中。此处的%IKVM_HOME%是指解压后ikvm的主目录。

    四、将java的jar包转换为.dll控件

    使用的命令:ikvmc -out:IKVM.dll test.jar

    其中IKVM.dll为将要生成的.dll控件文件名;test.jar为之前打包好的jar包文件。

    五、在C#项目中添加所需的控件

    1、新建一个C#.NET项目,首先添加一下必须的DLLs

    %IKVM_HOME%/bin/IKVM.OpenJDK.Core.dll

    %IKVM_HOME%/bin/IKVM.Runtime.dll

    %IKVM_HOME%/bin/IKVM.Runtime.JNI.dll

    2、添加已生成的.dll文件

    将之前生成好的.dll文件加载到C#项目中

    六、测试

    在C#项目中使用java类,其方法同java。但对包的引用使用C#的语法using

    源代码:

    Java源代码:

    package com.zht;

    //要调用的Java类

    public class Test {

    //要调用的Java方法

    public String returnString() {

    return "Hello, zht!";

    }

    }

    C#窗体源代码:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

    using com.zht;

    namespace KIVMTest

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)

    {

    Test t = new Test();

    string str = t.returnString();

    MessageBox.Show(str);

    }

    }

    }

    结果:

    启动C#窗口后,显示提示窗口,内容为:Hello, zht!

    展开全文
  • 假设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现?在java中,我们的类都是通过ClassLoader来加载的,同时...
  • 一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的...
  • java 怎么去调用jar包里面的方法

    千次阅读 2019-04-29 18:42:16
    首先在eclipse创建一个java工程项目,然后在src下创建一个类Demo。且在工程目录下创建一个lib文件夹,并将jar包存放到lib文件夹。创建后的工程目录如图。 ... 3、调用jar包的方法。 ...
  • 上期干货分享我们讲解了如何使用DBMS_LOGMNR系统包进行日志挖掘分析,本章讲解应用程序调用DM Logmnr接口进行日志分析的方法。DM Logmnr是达梦数据库的日志分析工具,包括JNI接口和C接口,本章讲解JAVA应用程序...
  • 居于反射机制Java动态调用jar方法

    千次阅读 2011-03-16 13:49:00
    或者通过上传一个新的jar文件实现比较简单直接热部署可以加入的系统新的线程运行,那么可以保证系统不用修改源代码的情况下实现更多的功能。   package com.shine.framework.JarUtil; import java...
  • 一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的...
  • 一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的...
  • 一、将已经编译后的java中Class文件进行打包;Eclipse或myeclipse进行Export选择jar即可。或者使用命令如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要...
  • Java调用IDL方法总结Java调用IDL程序,需要先在java加载IDL的java包(javaidlb.jar),该包不需要下载,在IDL的安装目录可以直接找到(C:\Program Files\Exelis\IDL82\resource\bridges\export\java\ javaidlb.jar)...
  • 调用jar其实就是调用类的main方法,main是没有返回值的,但其实jar仍然可以向外输出信息。比如sout,只要把打印的信息重定向到一个文件或控制台即可。 https://blog.csdn.net/tian6318/article/details/79349123 .....
  • jar包路径JAR_PATH=home/bin/test.jar# 要传递的参数PARAM=”1″# 调用jarjava -jar $JAR_PATH$PARAM或者直接 java -jarhome/bin/test.jar“1”“1” 将传递到jar包主程序的main方法中的参数列表第一位,...
  • [ASP.net教程]C#调用java类、jar方法。0 2012-03-14 14:00:35一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ ....
  • 由于FMX的JNIBridge将init作为默认的JAVA对象构造函数名,JAR中如果有方法名为init的类方法,FMX都会映射为构成函数,造成调用失败。这一问题需要官方修改Androidapi.JNIBridge单元的MethodIDFor方法逻辑,这里给出...
  • C#工程调用Java已生成的jar包步骤如下:一、使用IKVM.NET组件首先到IKVM官网(http://www.ikvm.net)下载组件,下载地址:https://sourceforge.net/projects/ikvm/files/将ikvmbin-7.2.4630.5.zip解压,我自己讲ikvmbin...
  • * 添加addJar方法 * @author Administrator * */ private static class MyClassLoader extends URLClassLoader { public MyClassLoader(URL[] urls) { super(urls); } public MyClassLoader(URL...
  • 2.C:\Program Files\ikvm-7.2.4630.5\bin配置在系统环境变量path 3.maven项目打包 执行如下命令 mvn clean mvn install 生成jar包 4.生成对应的dll文件 打开cmd,执行如下命令 ikvmc -o...
  • 在C#中调用Java生成的jar包文件的方法 C#工程调用Java已生成的jar包步骤如下: 一、使用IKVM.NET组件 首先到IKVM官网(http://www.ikvm.net)下载组件,下载地址:...
  • 1. 将java项目打成jar包; 2. 设定jar包的Main-class属性; 3. 在python通过subprocess执行jar包。 修改main函数打jar包 在intellijjar包: 1. File–> Project Structure… –> Artifacts –> + –> JAR –>...
  • 【摘要】集算器提供了 JDBC 驱动,很容易嵌入到 Java 程序调用方法和在 Java 执行 SQL 和存储过程类似。去乾学院看个究竟:Java 如何调用 SPL 脚本Java 应用程序部署集算器 JDBC首先将 JDBC 部署到 java 应用...
  • C#调用javajar文件的方法

    千次阅读 2011-09-15 16:08:00
    一、将已经编译后的java中Class文件进行打包; Eclipse或myeclipse进行Export选择jar即可。 二、到IKVM官方网站下载IKVM需要的组件http://sourceforge.net/projects/ikvm/files/ikvm/  ikv
  • 一、将已经编译后的java中Class文件进行打包;打包命令JAR(或者直接使用eclipse打包比较方便) 如:将某目录下的所有class文件夹全部进行打包处理; 使用的命令:jar cvf test.jar -C com/ . 其中test.jar为要生成...
  • C#调用java类、jar方法 一、将已经编译后的java中Class文件进行打包;打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理; 使用的命令:jar cvf test.jar -C com/ . 其中test.jar为要生成...
  • 1、python调用javajar

    千次阅读 2020-10-09 10:41:35
    在python中调用jar包 最近的项目功能需要调用客户的java接口,在调用接口的时候需要使用配套的jar包生成一些参数,但是公司的项目是用django搭建的,经过无数血与泪的尝试,最终终于找到了合适的方法去调用… jpype...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,788
精华内容 715
关键字:

java调用jar中方法

java 订阅