【发布时间】:2015-11-16 10:52:25
【问题描述】:
我正在尝试使用 C++ Builder(Android 开发)从 *.apk 文件动态访问 Java 类。为此,我在 Delphi 中找到了完整的示例指南(此处:http://www.pclviewer.com/android/androidJNI.html)。在 Delphi 中一切正常,但是当我尝试使用 C++ Builder XE7 将 Pascal 源代码(在指南末尾)重写为 C++ 时,我发现了一个奇怪的问题。如何在 C++ 中将 Delphi 接口转换为 TObject*,正确调用 ClassName() 函数并获取 JavaObjectID?花了很多时间,还是无法重写这3行代码:
var
JavaObject:JObject;
oTemp:TObject;
JavaObjectID:JNIObject;
:
oTemp:=JavaObject as TObject; //1. ?
JavaObjectID:=tjavaimport(otemp).GetObjectID; //2. ?
memo1.Lines.Add(oTemp.ClassName); //3. ?
:
我尝试过不同的类型转换,也使用 TObject 类的 GetInterface() 方法,但没有任何效果。作为一名 C++ 程序员,我不明白如何将 delphi 接口直接转换为 TObject*。
Androidapi::Jni::Javatypes::_di_JObject JavaObject;
System::TObject* oTemp;
Androidapi::Jni::_JNIObject *JavaObjectID;
:
oTemp = (TObject*)(&JavaObject); //Compiling ok, but segmentation fault
?
Memo1->Lines->Add(oTemp->ClassName()); // after ClassName() invoke.
有人知道吗。请问如何将这 3 行 Pascal 代码重写为 C++?非常感谢您的回复。
【问题讨论】:
-
我的问题是你为什么要将接口投射到
TObject。那不是你不应该做的事情吗? -
这种方式在 Delphi 示例 (pclviewer.com/android/androidJNI.html) 中使用并且功能齐全。我试图将代码逐行重写到 C++ Builder 项目中,但发现 C++ 没有接口。 Delphi 接口被 C++ Builder 中具有纯虚函数的抽象类所模仿。可能可以通过不同的方式重写提到的代码,或者直接在 C++ Builder 中使用 Delphi 生成的目标代码以及生成的 *.hpp 头文件,但是感觉,我不懂基础,无法从 Pascal 重写 3 行我不开心。
-
坚持接口会更有意义。完全用接口解决问题,停止尝试强制转换为实现对象。完全违背界面精神的东西。
-
也许你是对的。我会尝试不同的方式。即使仍然不明白如何在 Pascal 中编写“oTemp:=JavaObject as TObject”,然后正确获取返回“TJavaImport”的 ClassName。这两个实体在 Pascal 中也是完全不同的。它们唯一的共同点是,它们都支持 IUnknown 接口。常见的“ClassName”从何而来对我来说是个谜。
-
ClassName是TObject的一个方法。 Delphi 接口可以由类的实例实现,as强制转换是检索该实现实例的一种方式。当然,有些接口是外部的,不是由 Delphi 对象实现的。对他们来说,as演员将失败。
标签: java delphi c++builder