在 C++ Builder 中将 Delphi 接口转换为 TObject* 并调用正确的 ClassName() 函数
Casting a Delphi interface to TObject* in C++ Builder and proper ClassName() function call
我正在尝试使用 C++ Builder(Android 开发)从 *.apk 文件动态访问 Java classes。为此,我在 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 class 的 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++?非常感谢您的回复。
将接口转换为对象引用是 Delphi 独有的功能,如果不直接深入研究 vtable,C++ 中没有等效功能。但是,您可以做的是在 Delphi 中编写一个函数,该函数将接口作为输入,对其进行转换,然后 returns 将对象作为输出,然后在 C++ 代码中调用该函数。你可以在C++Builder工程中添加一个Delphi.pas
文件,编译时会生成一个C++.hpp
文件。
unit MyJavaHelper;
interface
uses
Androidapi.JNI.JavaTypes;
function JObjectToTObject(JavaObject: JObject): TObject;
implementation
function JObjectToTObject(JavaObject: JObject): TObject;
begin
Result := JavaObject as TObject;
end;
end.
#include "MyJavaHelper.hpp"
Androidapi::Jni::Javatypes::_di_JObject JavaObject;
System::TObject* oTemp;
Androidapi::Jni::_JNIObject *JavaObjectID;
JavaObject = ...;
oTemp = JObjectToTObject(JavaObject);
JavaObjectID = static_cast<TJavaImport*>(otemp)->GetObjectID();
Memo1->Lines->Add(oTemp->ClassName());
我正在尝试使用 C++ Builder(Android 开发)从 *.apk 文件动态访问 Java classes。为此,我在 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 class 的 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++?非常感谢您的回复。
将接口转换为对象引用是 Delphi 独有的功能,如果不直接深入研究 vtable,C++ 中没有等效功能。但是,您可以做的是在 Delphi 中编写一个函数,该函数将接口作为输入,对其进行转换,然后 returns 将对象作为输出,然后在 C++ 代码中调用该函数。你可以在C++Builder工程中添加一个Delphi.pas
文件,编译时会生成一个C++.hpp
文件。
unit MyJavaHelper;
interface
uses
Androidapi.JNI.JavaTypes;
function JObjectToTObject(JavaObject: JObject): TObject;
implementation
function JObjectToTObject(JavaObject: JObject): TObject;
begin
Result := JavaObject as TObject;
end;
end.
#include "MyJavaHelper.hpp"
Androidapi::Jni::Javatypes::_di_JObject JavaObject;
System::TObject* oTemp;
Androidapi::Jni::_JNIObject *JavaObjectID;
JavaObject = ...;
oTemp = JObjectToTObject(JavaObject);
JavaObjectID = static_cast<TJavaImport*>(otemp)->GetObjectID();
Memo1->Lines->Add(oTemp->ClassName());