2016-07-08 17 views
1

私はC++ Builder 10.1 Berlin Enterpriseを使用してモバイルアプリケーションを開発しています。アプリケーションの目的はバーコードをスキャンすることです、私はバーコードスキャナとAndroidのPDAを使用しています。スキャナに関連する関数は、JARファイルに含まれています。C++ Builder:JARファイルを含める

どのように私のプロジェクトでこれらの機能を使用できますか?私はすでに私のプロジェクトには、jarを追加するが、私は、私はスキャン機能を使用するために含める必要がわからない

EDIT

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. 

EDIT私はC++にこれのおかげで、私のブリッジファイルを変換することに成功した3

post。そこコンパイル時何ら問題はありませんが、リンクの段階で、私はこれらのエラーを持っている

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

:私はこのような私のアプリケーションで機能を使用しようとした

「[ldandroid Erreur] C:\ Users \ユーザーパブリック\ 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 \デバッグ\ Connexion.o:関数のTForm_Connexion :: TForm_Connexion(System :: Classes :: TComponent *):C:\ Users \ dylan \ Documents \ Embarcadero \ Studio \ Projets \ PDA_Android/Connexion.cpp:28:エラー:

未定義のリファレンス 'Androidapi :: Jnibridge :: TJavaGenericImport__2、システム:: DelphiInterface :: GetJavaClass()' "

と" [ldandroid Erreur] C:\ Users \ Public \ Documents \ Embarcadero \ Studio \ 18.0 \ TDE_Connexion:\ Inware \ Debug \ Connexion.o:\ Trojan \ bin \ arm-linux-androideabi-ld.exe:\ Documentation \ :3030:エラー:

Android用vtableへの未定義の参照:TForm_Connexion(System :: Classes :: TComponent *):C:¥Users¥dylan¥Documents¥Embarcadero¥Studio¥Projets¥PDA_Android/Connexion.cpp: :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. ターゲットプラットフォームノード内で、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

関連する問題