2016-07-08 205 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