2016-07-08 194 views
1

我正在使用C++ Builder 10.1 Berlin Enterprise开发移动应用程序。应用程序的目标是扫描条形码,我使用带有条码扫描器的Android PDA。与扫描器相关的功能包含在JAR文件中。C++ Builder:包含JAR文件

如何在我的项目中使用这些功能?

编辑

我已经将JAR添加到我的项目,但我不知道我有什么,包括使用扫描功能。

EDIT 2

我创建了一个桥文件,Java2OP。根据Embarcadero文档,我必须手动将它翻译为C++,但我不了解Delphi。这里是代码:

unit Android.JNI.ATLib; 

interface 

uses 
    Androidapi.JNIBridge, 
    Androidapi.JNI.JavaTypes; 

type 
// ===== Forward declarations ===== 

    JATLib = interface;//com.atid.lib.ATLib 

// ===== Interface declarations ===== 

    JATLibClass = interface(JObjectClass) 
    ['{E264906A-B076-4960-9EAE-17DF2D2AEE74}'] 
    {class} function _GetINTERNAL_PATH: JString; 
    {class} procedure _SetINTERNAL_PATH(Value: JString); 
    {class} property INTERNAL_PATH: JString read _GetINTERNAL_PATH write _SetINTERNAL_PATH; 
    end; 

    [JavaSignature('com/atid/lib/ATLib')] 
    JATLib = interface(JObject) 
    ['{EFCFE579-FB94-432F-8DBB-851521F1EED7}'] 
    end; 
    TJATLib = class(TJavaGenericImport<JATLibClass, JATLib>) end; 

implementation 

procedure RegisterTypes; 
begin 
    TRegTypes.RegisterType('Android.JNI.ATLib.JATLib', TypeInfo(Android.JNI.ATLib.JATLib)); 
end; 

initialization 
    RegisterTypes; 
end. 

你可以给我一些建议,将其转换为C++?

我也尝试包括PAS文件,但是当我整理的项目,我有这样的错误:

Compiler for "Delphi.Personality" and the platform "Android" is missing or unavailable. 

编辑3

我成功了我的桥梁文件++转换到C感谢这个post。我试图使用该功能在我的应用程序是这样的:

TJATScanLib* scan = new TJATScanLib(); 
_di_JATScanLib scanner = scan->JavaClass->init(); 

编译过程中,但在链接步骤没有任何问题,我有这些错误:

“[ldandroid ERREUR] C:\用户\ Public \ Documents \ Embarcadero \ Studio \ 18.0 \ CatalogRepository \ AndroidNDK-9c_x86_GIB.Build.22858.6822 \ toolchains \ arm-linux-androideabi-4.6 \ prebuilt \ windows \ bin \ arm-linux-androideabi-ld.exe:。\ Android \ Debug \ Connexion.o:in function TForm_Connexion :: TForm_Connexion(System :: Classes :: TComponent *):C:\ Users \ dylan \ Documents \ Embarcadero \ Studio \ Projets \ PDA_Android/Connexion.cpp:28:error:

未定义引用'Androidapi :: Jnibridge :: TJavaGenericImport__2,System :: DelphiInterface> :: GetJavaClass()'“

and”[ldandroid Erreur] C:\ Users \ Public \ Documents \ Embarcadero \ Studio \ 18.0 \ CatalogRepository \ AndroidNDK-9c_x86_GIB.Build.22858.6822 \ toolchains \ arm-linux-androideabi-4.6 \ prebuilt \ windows \ bin \ arm-linux-androideabi-ld.exe:。\ Android \ Debug \ Connexion.o:in function TForm_Connexion: :TForm_Connexion(System :: Classes :: TComponent *):C:\ Users \ dylan \ Documents \ Embarcadero \ Studio \ Projets \ PDA_Android/Connexion.cpp:30:error:

未定义的引用' :Jni :: Atscanlib :: TJATScanLib'“

我的桥文件:

#ifndef Android_JNI_ATScanLibH 
#define Android_JNI_ATScanLibH 

#pragma delphiheader begin 
#pragma option push 
#pragma option -w-  // All warnings off 
#pragma option -Vx  // Zero-length empty class member 
#pragma pack(push,8) 

#include <Androidapi.JNIBridge.hpp> 
#include <Androidapi.JNI.JavaTypes.hpp> 

#include <System.hpp> 
#include <SysInit.hpp> 

namespace Android{ 
namespace Jni{ 
namespace Atscanlib{ 

__interface JAsyncTask; 
typedef System::DelphiInterface<JAsyncTask> _di_JAsyncTask; 

__interface JAsyncTaskClass; 
typedef System::DelphiInterface<JAsyncTaskClass> _di_JAsyncTaskClass; 

__interface JAsyncTask_Status; 
typedef System::DelphiInterface<JAsyncTask_Status> _di_JAsyncTask_Status; 

__interface JAsyncTask_StatusClass; 
typedef System::DelphiInterface<JAsyncTask_StatusClass> _di_JAsyncTask_StatusClass; 

__interface JATScanLib; 
typedef System::DelphiInterface<JATScanLib> _di_JATScanLib; 

__interface JATScanLibClass; 
typedef System::DelphiInterface<JATScanLibClass> _di_JATScanLibClass; 

__interface JATScanLib_OnResponseListener; 
typedef System::DelphiInterface<JATScanLib_OnResponseListener> _di_JATScanLib_OnResponseListener; 

__interface JATScanLib_OnResponseListenerClass; 
typedef System::DelphiInterface<JATScanLib_OnResponseListenerClass> _di_JATScanLib_OnResponseListenerClass; 

__interface JATScanLib_TagSequenceTask; 
typedef System::DelphiInterface<JATScanLib_TagSequenceTask> _di_JATScanLib_TagSequenceTask; 

__interface JATScanLib_TagSequenceTaskClass; 
typedef System::DelphiInterface<JATScanLib_TagSequenceTask> _di_JATScanLib_TagSequenceTaskClass; 

__interface JVoid; 
typedef System::DelphiInterface<JVoid> _di_JVoid; 

__interface JVoidClass; 
typedef System::DelphiInterface<JVoid> _di_JVoidClass; 

__interface INTERFACE_UUID("{73C141D6-F8D7-4FE4-BFA3-3441B6367189}") JAsyncTaskClass : public Androidapi::Jni::Javatypes::JObjectClass 
{ 
public: 
    virtual JExecutor _GetSERIAL_EXECUTOR() = 0; 
    virtual JExecutor _GetTHREAD_POOL_EXECUTOR() = 0; 
    HIDESBASE virtual _di_JAsyncTask __cdecl init() = 0; 
    HIDESBASE virtual void __cdecl execute(JRunnable runnable) = 0; 

    __property JExecutor SERIAL_EXECUTOR = {read = _GetSERIAL_EXECUTOR}; 
    __property JExecutor THREAD_POOL_EXECUTOR = {read = _GetTHREAD_POOL_EXECUTOR}; 

}; 

__interface INTERFACE_UUID("{73C141D6-F8D7-4FE4-BFA3-3441B6367189}") JAsyncTask : public Androidapi::Jni::Javatypes::JObject 
{ 
public: 
    virtual bool __cdecl cancel(bool mayInterruptIfRunning) = 0; 
    HIDESBASE virtual JObject __cdecl get() = 0; 
    HIDESBASE virtual JObject __cdecl get(__int64 timeout, JTimeUnit unit_) = 0; 
    virtual _di_JAsyncTask_Status __cdecl getStatus() = 0; 
    virtual bool __cdecl isCancelled() = 0; 

}; 
#pragma pack(push,4) 

class PASCALIMPLEMENTATION TJAsyncTask : public Androidapi::Jnibridge::TJavaGenericImport__2<_di_JAsyncTaskClass, _di_JAsyncTask>{ 
    typedef Androidapi::Jnibridge::TJavaGenericImport__2<_di_JAsyncTaskClass, _di_JAsyncTask> inherited; 
    public: 
     inline __fastcall TJAsyncTask() : Androidapi::Jnibridge::TJavaGenericImport__2<_di_JAsyncTaskClass, _di_JAsyncTask>(){} 
     inline __fastcall virtual ~TJAsyncTask(void){} 
}; 

#pragma pack(pop) 


__interface INTERFACE_UUID("{16452E24-44D5-4E84-990E-3C1916FB372B}") JAsyncTask_StatusClass : public Androidapi::Jni::Javatypes::JEnumClass 
{ 
public: 
    virtual _di_JAsyncTask_Status _GetFINISHED() = 0; 
    virtual _di_JAsyncTask_Status _GetPENDING() = 0; 
    virtual _di_JAsyncTask_Status _GetRUNNING() = 0; 
    virtual _di_JAsyncTask_Status __cdecl valueOf(JString name) = 0; 
    virtual TJavaObjectArray__1<_di_JAsyncTask_Status> __cdecl values() = 0; 


    __property _di_JAsyncTask_Status FINISHED = {read = _GetFINISHED}; 
    __property _di_JAsyncTask_Status PENDING = {read = _GetPENDING}; 
    __property _di_JAsyncTask_Status RUNNING = {read = _GetRUNNING}; 

}; 

__interface INTERFACE_UUID("{96B0BCE7-1312-49B9-9F33-43541680B0E7}") JAsyncTask_Status : public Androidapi::Jni::Javatypes::JEnum 
{ 
}; 
#pragma pack(push,4) 

class PASCALIMPLEMENTATION TJAsyncTask_Status : public Androidapi::Jnibridge::TJavaGenericImport__2<_di_JAsyncTask_StatusClass, _di_JAsyncTask_Status>{ 
    typedef Androidapi::Jnibridge::TJavaGenericImport__2<_di_JAsyncTask_StatusClass, _di_JAsyncTask_Status> inherited; 
    public: 
     inline __fastcall TJAsyncTask_Status() : Androidapi::Jnibridge::TJavaGenericImport__2<_di_JAsyncTask_StatusClass, _di_JAsyncTask_Status>(){} 
     inline __fastcall virtual ~TJAsyncTask_Status(void){} 
}; 

#pragma pack(pop) 

__interface INTERFACE_UUID("{9A209D1D-07C6-4309-88AD-8A2EF359CF34}") JATScanLibClass : public Androidapi::Jni::Javatypes::JObjectClass 
{ 
public: 
    virtual int _GetREAD_ENCODING_ERROR() = 0; 
    virtual int _GetREAD_ERROR() = 0; 
    virtual int _GetREAD_OK() = 0; 
    virtual int _GetREAD_TIMEOUT() = 0; 
    HIDESBASE virtual _di_JATScanLib __cdecl init() = 0; 

    __property int READ_ENCODING_ERROR = {read = _GetREAD_ENCODING_ERROR}; 
    __property int READ_ERROR = {read = _GetREAD_ERROR}; 
    __property int READ_OK = {read = _GetREAD_OK}; 
    __property int READ_TIMEOUT = {read = _GetREAD_TIMEOUT}; 

}; 

__interface INTERFACE_UUID("{74B37E9E-F88A-4EB0-AEDF-538A472223A0}") JATScanLib : public Androidapi::Jni::Javatypes::JObject 
{ 
public: 
    virtual int __cdecl Read(TJavaArray__1<Byte> P1) = 0; 
    virtual JString __cdecl getReadResults() = 0; 
    virtual void __cdecl init() = 0; 
    virtual void __cdecl setEncoding(JString P1) = 0; 
    virtual void __cdecl setOnResponseListener(_di_JATScanLib_OnResponseListener P1) = 0; 
    virtual void __cdecl start() = 0; 
    virtual void __cdecl stop() = 0; 
}; 
#pragma pack(push,4) 

class PASCALIMPLEMENTATION TJATScanLib : public Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLibClass, _di_JATScanLib>{ 
    typedef Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLibClass, _di_JATScanLib> inherited; 
    public: 
     inline __fastcall TJATScanLib() : Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLibClass, _di_JATScanLib>(){} 
     inline __fastcall virtual ~TJATScanLib(void){} 
}; 

#pragma pack(pop) 

__interface INTERFACE_UUID("{654B87BA-B4EE-4102-85E9-9FDFF3C82BAA}") JATScanLib_OnResponseListenerClass : public Androidapi::Jnibridge::IJavaClass 
{ 
}; 

__interface INTERFACE_UUID("{35AC182B-7684-47EA-9BA8-07B504F85943}") JATScanLib_OnResponseListener : public Androidapi::Jnibridge::IJavaInstance 
{ 
public: 
    virtual void __cdecl onResponse(int P1) = 0; 
}; 
#pragma pack(push,4) 

class PASCALIMPLEMENTATION TJATScanLib_OnResponseListener : public Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLib_OnResponseListenerClass, _di_JATScanLib_OnResponseListener>{ 
    typedef Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLib_OnResponseListenerClass, _di_JATScanLib_OnResponseListener> inherited; 
    public: 
     inline __fastcall TJATScanLib_OnResponseListener() : Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLib_OnResponseListenerClass, _di_JATScanLib_OnResponseListener>(){} 
     inline __fastcall virtual ~TJATScanLib_OnResponseListener(void){} 
}; 

#pragma pack(pop) 

__interface INTERFACE_UUID("{1CF84DF6-6115-4FB5-9967-B55E74A3155C}") JATScanLib_TagSequenceTaskClass : public _di_JAsyncTaskClass 
{ 
}; 

__interface INTERFACE_UUID("{B83D8A9F-C1C4-4023-B1D8-3D9ABFB1FD2C}") JATScanLib_TagSequenceTask : public _di_JAsyncTask 
{ 
}; 
#pragma pack(push,4) 

class PASCALIMPLEMENTATION TJATScanLib_TagSequenceTask : public Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLib_TagSequenceTaskClass, _di_JATScanLib_TagSequenceTask>{ 
    typedef Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLib_TagSequenceTaskClass, _di_JATScanLib_TagSequenceTask> inherited; 
    public: 
     inline __fastcall TJATScanLib_TagSequenceTask() : Androidapi::Jnibridge::TJavaGenericImport__2<_di_JATScanLib_TagSequenceTaskClass, _di_JATScanLib_TagSequenceTask>(){} 
     inline __fastcall virtual ~TJATScanLib_TagSequenceTask(void){} 
}; 

#pragma pack(pop) 

__interface INTERFACE_UUID("{E5AB6B2B-2580-469B-BBF6-C226984DFEBE}") JVoidClass : public Androidapi::Jni::Javatypes::JObjectClass 
{ 
public: 
    virtual Jlang_Class _GetTYPE() = 0; 
    __property Jlang_Class TYPE = {read = _GetTYPE}; 

}; 

__interface INTERFACE_UUID("{013CC63A-938C-46BE-ACAC-BA854F2F6AC8}") JVoid : public Androidapi::Jni::Javatypes::JObject 
{ 
}; 
#pragma pack(push,4) 

class PASCALIMPLEMENTATION TJVoid : public Androidapi::Jnibridge::TJavaGenericImport__2<_di_JVoidClass, _di_JVoid>{ 
    typedef Androidapi::Jnibridge::TJavaGenericImport__2<_di_JVoidClass, _di_JVoid> inherited; 
    public: 
     inline __fastcall TJVoid() : Androidapi::Jnibridge::TJavaGenericImport__2<_di_JVoidClass, _di_JVoid>(){} 
     inline __fastcall virtual ~TJVoid(void){} 
}; 
#pragma pack(pop) 
} 
} 
} 
#if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_ANDROID_JNI_ATLIB) 
    using namespace Android::Jni::Atscanlib; 
#endif 

#if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_ANDROID_JNI) 
    using namespace Android::Jni; 
#endif 

#if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_ANDROID) 
    using namespace Android; 
#endif 

#pragma pack(pop) 
#pragma option pop 

#pragma delphiheader end. 
#endif 

回答

0

您可以简单地使用项目经理来做到这一点。

  1. 项目管理器中,扩展项目的目标平台节点。
  2. 在Target Platforms节点中,扩展Android节点。 右键单击库节点并选择添加
  3. 在打开的对话框中,选择要添加到Android应用程序的.jar文件,然后选择打开
+0

我已经这样做了,但我不知道要使用哪些文件来使用JAR文件的功能。 – Dylan

+0

您需要将JAR文件本身添加到Android节点中。之后,您必须将正确的导入添加到代码中。 –

+1

@JeanVitor“正确导入代码”就是缺少的东西。仅仅添加JAR文件本身是不够的,您还需要使用JAR文件内容的代码。你*可以*手动编写该代码,但是这样做乏味且容易出错。 Embarcadero拥有一个Java2OP工具,可为您生成该代码。 –

1

本主题涵盖英巴卡迪诺的文档中:

Using a Custom Set of Java Libraries In Your RAD Studio Android Apps

RAD Studio allows you to use your own or third-party Java libraries in RAD Studio applications.

To use a custom set of libraries in your RAD Studio Android applications:

  1. Ensure that your Java libraries meet the RAD Studio requirements for Java libraries .

  2. Create a native bridge file that your Delphi or C++ applications can use to access the APIs of your Java libraries.

  3. Add your Java libraries to your application .

什么你缺少你的项目是第2步。您可以使用Embarcadero的Java2OP工具来生成该桥文件。

+0

我知道我错过了第2步,但是当我想下载Java2OP时,它说我没有好的版本。我需要一个XE,我有柏林10.1 – Dylan

+0

我不明白你在说什么。 Java2OP是柏林的一部分,你不需要XE版本。只需登录您的EDN帐户并下载Java2OP for Berlin。您应该事先已经注册了柏林牌照。 –

+0

对不起!我以为我已经注册了我的柏林牌照,但我仍在使用试用版。我下载了Java2OP,并且即将创建一个桥文件。有消息通知你。 – Dylan