I'm trying to solve a little problem with my hpp unit. I found some examples on the internet showing how to Toast an information on screen with an Android JNI bridge, but it was just in pascal (delphi), so I decided to use the same pas file but with it an hpp file for conversion. Till now I got it:
#ifndef Android_Jni_ToastHPP #define Android_Jni_ToastHPP #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 <FMX.Helpers.Android.hpp> // Pascal unit #include <Androidapi.JNIBridge.hpp> // Pascal unit #include <Androidapi.JNI.JavaTypes.hpp> // Pascal unit #include <Androidapi.JNI.GraphicsContentViewText.hpp> // Pascal unit #include <Androidapi.JNI.Util.hpp> // Pascal unit #include <Androidapi.JNI.App.hpp> // Pascal unit #include <FMX.Surfaces.hpp> // Pascal unit //-- user supplied ----------------------------------------------------------- namespace Android { namespace Jni { namespace Toast { //-- type declarations ------------------------------------------------------- extern DELPHI_PACKAGE Androidapi::Jni::Toast __fastcall Toast(const System::UnicodeString Msg, TToastLength duration); #pragma pack(pop) //-- type declarations ------------------------------------------------------- //-- var, const, procedure --------------------------------------------------- } /* namespace Android */ } /* namespace JNI */ } /* namespace Toast */ #if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_ANDROID_JNI_TOAST) using namespace Android::Jni::Toast; #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. //-- end unit ---------------------------------------------------------------- #endif // Androidapi_Jni_ToastHPP
If you would like to have the pascal unit, here is it:
unit Android.JNI.Toast; interface {$IFDEF ANDROID} uses Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText; {$ENDIF} {$IFDEF ANDROID} type TToastLength = (LongToast, ShortToast); JToast = interface; JToastClass = interface(JObjectClass) ['{69E2D233-B9D3-4F3E-B882-474C8E1D50E9}'] { Property methods } function _GetLENGTH_LONG: Integer; cdecl; function _GetLENGTH_SHORT: Integer; cdecl; { Methods } function init(context: JContext): JToast; cdecl; overload; function makeText(context: JContext; text: JCharSequence; duration: Integer) : JToast; cdecl; { Properties } property LENGTH_LONG: Integer read _GetLENGTH_LONG; property LENGTH_SHORT: Integer read _GetLENGTH_SHORT; end; [JavaSignature('android/widget/Toast')] JToast = interface(JObject) ['{FD81CC32-BFBC-4838-8893-9DD01DE47B00}'] { Methods } procedure cancel; cdecl; function getDuration: Integer; cdecl; function getGravity: Integer; cdecl; function getHorizontalMargin: Single; cdecl; function getVerticalMargin: Single; cdecl; function getView: JView; cdecl; function getXOffset: Integer; cdecl; function getYOffset: Integer; cdecl; procedure setDuration(value: Integer); cdecl; procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl; procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl; procedure setText(s: JCharSequence); cdecl; procedure setView(view: JView); cdecl; procedure show; cdecl; end; TJToast = class(TJavaGenericImport<JToastClass, JToast>) end; procedure Toast(const Msg: string; duration: TToastLength = ShortToast); {$ENDIF} implementation {$IFDEF ANDROID} uses FMX.Helpers.Android, Androidapi.Helpers; procedure Toast(const Msg: string; duration: TToastLength); var ToastLength: Integer; begin if duration = ShortToast then ToastLength := TJToast.JavaClass.LENGTH_SHORT else ToastLength := TJToast.JavaClass.LENGTH_LONG; CallInUiThread( procedure begin TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(Msg), ToastLength).show end); end; {$ENDIF} end.
However I get error when compilling using this source... What con I do?
PS.: I arrived on that state just comparing AppMetthod sources with what I was making...
Log:
Checking project dependencies... Compiling WebBrowser.cbproj (Debug, Android) bccaarm command line for "uMain.cpp" c:\program files (x86)\embarcadero\studio\15.0\bin\bccaarm.exe -cc1 -D _DEBUG -isysroot C:\Users\Public\Documents\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\platforms\android-14\arch-arm -idirafter =\usr\include -idirafter C:\Users\Public\Documents\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\sources\cxx-stl\gnu-libstdc++\4.8\include -idirafter C:\Users\Public\Documents\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabi-v7a\include -idirafter C:\Users\Public\Documents\Embarcadero\Studio\15.0\PlatformSDKs\android-ndk-r9c\sources\android\native_app_glue -I "C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\CPP\Mobile Snippets\WebBrowser" -isystem "c:\program files (x86)\embarcadero\studio\15.0\include" -isystem "c:\program files (x86)\embarcadero\studio\15.0\include\android\rtl" -isystem "c:\program files (x86)\embarcadero\studio\15.0\include\android\fmx" -isystem "c:\program files (x86)\embarcadero\studio\15.0\include\android\crtl" -g -fno-limit-debug-info -fborland-extensions -fborland-auto-refcount -nobuiltininc -nostdsysteminc -triple thumbv7-none-linux-androideabi -emit-obj -mconstructor-aliases -pic-level 2 -target-abi aapcs-linux -nostdinc++ -fdeprecated-macro -fexceptions -fcxx-exceptions -munwind-tables -mstackrealign -fno-spell-checking -fno-use-cxa-atexit -main-file-name uMain.cpp -x c++ -std=c++11 -O0 -tU -o .\Android\Debug\uMain.o -dependency-file .\Android\Debug\uMain.d -MT .\Android\Debug\uMain.o uMain.cpp [bccaarm Error] Android.JNI.Toast.hpp(36): expected a class or namespace [bccaarm Error] Android.JNI.Toast.hpp(36): reference to 'Android' is ambiguous Android.JNI.Toast.hpp(28): candidate found by name lookup is 'Android' FMX.Helpers.Android.hpp(28): candidate found by name lookup is 'Fmx::Helpers::Android' [bccaarm Error] Android.JNI.Toast.hpp(36): expected unqualified-id [bccaarm Error] Android.JNI.Toast.hpp(47): expected a class or namespace [bccaarm Error] Android.JNI.Toast.hpp(47): reference to 'Android' is ambiguous Android.JNI.Toast.hpp(28): candidate found by name lookup is 'Android' FMX.Helpers.Android.hpp(28): candidate found by name lookup is 'Fmx::Helpers::Android' [bccaarm Error] Android.JNI.Toast.hpp(47): expected namespace name [bccaarm Error] Android.JNI.Toast.hpp(50): expected a class or namespace [bccaarm Error] Android.JNI.Toast.hpp(50): reference to 'Android' is ambiguous Android.JNI.Toast.hpp(28): candidate found by name lookup is 'Android' FMX.Helpers.Android.hpp(28): candidate found by name lookup is 'Fmx::Helpers::Android' [bccaarm Error] Android.JNI.Toast.hpp(50): expected namespace name [bccaarm Error] Android.JNI.Toast.hpp(53): reference to 'Android' is ambiguous Android.JNI.Toast.hpp(28): candidate found by name lookup is 'Android' FMX.Helpers.Android.hpp(28): candidate found by name lookup is 'Fmx::Helpers::Android' [bccaarm Error] uMain.cpp(32): use of undeclared identifier 'Toast' Failed Elapsed time: 00:00:05.8
EDIT:
New log file:
[bccaarm Error] Androidapi.JNI.Toast.hpp(36): no type named 'Toast' in namespace 'Androidapi::Jni' [bccaarm Error] Androidapi.JNI.Toast.hpp(36): expected unqualified-id [bccaarm Error] uMain.cpp(32): unexpected namespace name 'Toast': expected expression Failed
Since now, thanks a lot.