【问题标题】:Pass Java .class file to Delphi Constructor将 Java .class 文件传递​​给 Delphi 构造函数
【发布时间】:2017-08-03 14:22:56
【问题描述】:

我正在使用 JNI 来访问 Delphi 10.2 Tokyo 中的 Android 功能。我需要传递一个 .class 类型作为 Delphi 函数构造函数的参数。

原来的Java方法是这样的:

private Intent getServiceIntent() {
    return new Intent(this, ToyVpnService.class);
}

来自Intent 构造函数的 Android 文档:

Intent(Context packageContext, Class<?> cls)

为特定组件创建意图。

我必须使用这个构造函数,我不能改变它。

我需要将其翻译为 Delphi,但我一直无法传递 .class 类型。 现在,我的代码看起来像这样:

function TForm1.GetServiceIntent: JIntent;
begin
  result := TJIntent.JavaClass.init(FContext, ???);
end;

我尝试使用 Java 中的 ClassLoader,但无法访问 loadClass() 函数,因为它仅受保护所以包。

我尝试使用Class.forName,但无法从.class 文件中指定Path

我将.class 文件添加为Delphi 资源文件并通过TResourceStream 加载它,但找不到将此输入转换为Java Class 引用的解决方案。

【问题讨论】:

  • 我的第一个问题是为什么在 Delphi 程序中需要 java 类文件?
  • @rabbit, FireMonkey.
  • 因为 JIntent 的构造函数需要这个。来自 Java Doc:“Intent(Context packageContext, Class> cls) 为特定组件创建意图。”developer.android.com/reference/android/content/Intent.html 我必须使用此方法,并且无法更改。
  • ToyVpnService.class 不是对 Java .class 文件的引用,它是对 Java 的引用。

标签: java android delphi java-native-interface delphi-10.2-tokyo


【解决方案1】:

基于this answer,我猜应该是这样的

Intent := TJIntent.JavaClass.init(SharedActivityContext,
  TJLang_Class.JavaClass.forName(StringToJString('com.example.ToyVpnService'),
  True, SharedActivity.getClassLoader));

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 2022-01-12
    • 2012-06-06
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多