-
调用java类 jar包方法_C#调用java类、jar包方法
2021-03-04 10:05:48一、将已经编译后的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 java调用方法_Delphi FMX调用JAR里的JAVA类Init方法
2021-03-18 14:53:20本文背景: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;
测试结果:
-
c调用java jar_C#调用java类、jar包方法
2021-03-06 15:37:34一、将已经编译后的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!
-
c调用java jar_C#调用java类、jar包方法。
2021-03-06 15:38:16一、将已经编译后的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!
-
java 引用jar包里的方法_动态添加jar包并调用jar包里面的方法
2021-02-26 13:15:33假设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现?在java中,我们的类都是通过ClassLoader来加载的,同时... -
c调用java jar_C#调用java类、jar包方法(转)
2021-03-06 15:37:35一、将已经编译后的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包的方法。 ... -
c++ 调用jar 包_【干货分享】JAVA调用DM Logmnr日志分析方法
2020-12-26 10:22:24上期干货分享中我们讲解了如何使用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... -
wpf 调用 java_C#调用java类、jar包方法
2021-03-04 07:10:22一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的... -
csharp 调用 java_C#调用java类、jar包方法
2021-02-27 10:50:45一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的... -
c 调用java包_C#调用java的jar文件的方法(转)
2021-02-27 09:56:12一、将已经编译后的java中Class文件进行打包;Eclipse或myeclipse进行Export选择jar即可。或者使用命令如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .其中test.jar为要... -
java调用idl_Java调用IDL方法总结
2021-02-26 08:24:56Java调用IDL方法总结Java调用IDL程序,需要先在java中加载IDL的java包(javaidlb.jar),该包不需要下载,在IDL的安装目录中可以直接找到(C:\Program Files\Exelis\IDL82\resource\bridges\export\java\ javaidlb.jar)... -
java-linux中调用jar并获取jar的返回值
2020-05-11 12:06:55调用jar其实就是调用类的main方法,main是没有返回值的,但其实jar仍然可以向外输出信息。比如sout,只要把打印的信息重定向到一个文件或控制台即可。 https://blog.csdn.net/tian6318/article/details/79349123 ..... -
linux java -jar 参数_Linux Shell 调用jar包与参数传递
2021-02-26 14:27:32jar包路径JAR_PATH=home/bin/test.jar# 要传递的参数PARAM=”1″# 调用jar包java -jar $JAR_PATH$PARAM或者直接 java -jarhome/bin/test.jar“1”“1” 将传递到jar包主程序的main方法中的参数列表第一位,... -
asp.net 调用java_[ASP.net教程]C#调用java类、jar包方法。
2021-03-07 15:52:02[ASP.net教程]C#调用java类、jar包方法。0 2012-03-14 14:00:35一、将已经编译后的java中Class文件进行打包;打包命令JAR如:将某目录下的所有class文件夹全部进行打包处理;使用的命令:jar cvf test.jar -C com/ .... -
FMX调用JAR里的JAVA类Init方法
2019-02-11 15:14:24由于FMX的JNIBridge将init作为默认的JAVA对象构造函数名,JAR中如果有方法名为init的类方法,FMX都会映射为构成函数,造成调用失败。这一问题需要官方修改Androidapi.JNIBridge单元的MethodIDFor方法逻辑,这里给出... -
c 调用java包_在C#中调用Java生成的jar包文件的方法
2021-02-27 09:56:17C#工程调用Java已生成的jar包步骤如下:一、使用IKVM.NET组件首先到IKVM官网(http://www.ikvm.net)下载组件,下载地址:https://sourceforge.net/projects/ikvm/files/将ikvmbin-7.2.4630.5.zip解压,我自己讲ikvmbin... -
如何使用java命令调用某个jar文件中的方法?
2015-05-15 02:03:26* 添加addJar方法 * @author Administrator * */ private static class MyClassLoader extends URLClassLoader { public MyClassLoader(URL[] urls) { super(urls); } public MyClassLoader(URL... -
C#应用程序调用java jar包中的方法
2019-12-02 14:49:422.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包文件的方法
2017-07-22 15:34:00在C#中调用Java生成的jar包文件的方法 C#工程调用Java已生成的jar包步骤如下: 一、使用IKVM.NET组件 首先到IKVM官网(http://www.ikvm.net)下载组件,下载地址:... -
Python调用jar包方法实现过程解析
2020-12-17 07:49:121. 将java项目打成jar包; 2. 设定jar包的Main-class属性; 3. 在python中通过subprocess执行jar包。 修改main函数打jar包 在intellij中打jar包: 1. File–> Project Structure… –> Artifacts –> + –> JAR –>... -
c++ 调用jar 包_Java 如何调用 SPL 脚本
2020-12-26 12:21:47【摘要】集算器提供了 JDBC 驱动,很容易嵌入到 Java 程序调用,方法和在 Java 中执行 SQL 和存储过程类似。去乾学院看个究竟:Java 如何调用 SPL 脚本Java 应用程序中部署集算器 JDBC首先将 JDBC 部署到 java 应用... -
C#调用java的jar文件的方法
2011-09-15 16:08:00一、将已经编译后的java中Class文件进行打包; Eclipse或myeclipse进行Export选择jar即可。 二、到IKVM官方网站下载IKVM需要的组件http://sourceforge.net/projects/ikvm/files/ikvm/ ikv -
C#调用java类、jar包方法
2015-11-22 08:51:00一、将已经编译后的java中Class文件进行打包;打包命令JAR(或者直接使用eclipse打包比较方便) 如:将某目录下的所有class文件夹全部进行打包处理; 使用的命令:jar cvf test.jar -C com/ . 其中test.jar为要生成... -
C#调用java类、jar包方法;eclipse生成jar包
2012-12-05 20:08:00C#调用java类、jar包方法 一、将已经编译后的java中Class文件进行打包;打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理; 使用的命令:jar cvf test.jar -C com/ . 其中test.jar为要生成... -
1、python调用java的jar包
2020-10-09 10:41:35在python中调用jar包 最近的项目功能需要调用客户的java接口,在调用接口的时候需要使用配套的jar包生成一些参数,但是公司的项目是用django搭建的,经过无数血与泪的尝试,最终终于找到了合适的方法去调用… jpype...