Einzelnen Beitrag anzeigen

knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Android AlarmManager periodisch einen Event bekommen

  Alt 27. Jul 2018, 14:03
Mit dem Tipp (russische Anleitung "Erstellen einer Java-BroadcastReceiver-Klasse für Delphi") habe ich leider leichte Probleme. Ich habe die dort abgedruckte batch-Datei fast in jeder zeile angepasst, damit es lauffähig ist.

Probleme habe ich nun bei Schritt 3 in der Batch-Datei:
Code:
REM @echo off
 
setlocal
 
REM Pfad zum Android SDK
if x%ANDROID% == x set ANDROID=C:\Users\Public\Documents\Embarcadero\Studio\19.0\CatalogRepository\AndroidSDK-2433_19.0.29899.2631

REM Pfad zum Java-Compiler
set JAVAC_DIR="C:\Program Files\Java\jdk1.8.0_60\bin"

REM Pfad zur Android-Plattform
set ANDROID_PLATFORM=%ANDROID%\platforms\android-22

set DX_LIB=%ANDROID%\build-tools\22.0.1\lib

set EMBO_DEX="C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\classes.dex"

set PROJ_DIR=%CD%

echo ==========================================================================================
echo.
echo  1. Compiling the Java service activity source files
echo.
mkdir output 2> nul
mkdir output\classes 2> nul
%JAVAC_DIR%\javac -verbose -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d "output\classes" "src\com\MNCClasses\AlarmReceiver.java"
 
echo ==========================================================================================
echo.
echo  2. Creating jar containing the new classes
echo.
mkdir output\jar 2> nul
%JAVAC_DIR%\jar cvf %PROJ_DIR%\output\jar\MNCClasses_classes.jar -C output\classes com\MNCClasses\AlarmReceiver.class
 
echo ==========================================================================================
echo.
echo  3. Converting from jar to dex...
echo.
mkdir output\dex 2> nul
java -jar %DX_LIB%\dx.jar --dex --verbose --output=output\dex\MNCClasses_classes.dex --positions=lines output\jar\MNCClasses_classes.jar
REM erzeugt Fehler: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
 
echo ==========================================================================================
echo.
echo Merging dex files
echo.com.android.dx.merge.DexMerger
java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\MNCClasses_classes.dex %EMBO_DEX%
 
echo Tidying up
echo.
rmdir /s /q output\classes
del output\dex\test_classes.dex
rmdir /s /q output\jar
 
echo ==========================================================================================
echo Now we have the end result, which is output\dex\classes.dex
 
:Exit
 
endlocal
pause
die aktuelle Zeile (unter Schritt 3)
Code:
java -jar %DX_LIB%\dx.jar --dex --verbose --output=output\dex\MNCClasses_classes.dex --positions=lines output\jar\MNCClasses_classes.jar
lautete ursprünglich so:
Code:
call %DX_LIB%\dx.jar --dex --verbose --output=output\dex\MNCClasses_classes.dex output\jar\MNCClasses_classes.jar
mit call kann das doch nicht funzen, oder? damit führt man doch batch-Dateien oder exe oder vergleichbares von Windows aus. Oder gibt es in Java eine call.exe? wenn ja, dann nicht in meiner installation. Egal. Ich vermute, dass der Aufruf mit "java -jar ..." korrekt ist.

Nichtsdestotrotz erzeugt dieser Aufruf immer nur eine Fehlermeldung, die auch schon oben in der Batch-Datei angerissen ist. Die vollständige Meldung lautet:
Code:
processing archive output\jar\MNCClasses_classes.jar...
ignored resource META-INF/MANIFEST.MF
processing com/MNCClasses/AlarmReceiver.class...

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:704)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
        at com.android.dx.command.dexer.Main.access$300(Main.java:83)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:632)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)
...while parsing com/MNCClasses/AlarmReceiver.class

1 error; aborting
Google hat mich bereits darauf gebracht, dass dies in irgendeiner Form ein Versionskonflikt im Java oder mit Android Versionen sein kann. Aber das hilft mir im Moment wenig. Hat irgendein Java-Profi eine Ahnung, was ich tun kann?

Aktuell scheint Delphi die Android-Platform in der Version 22 zu nutzen und das SDK in Version 2433_19.0.29899.2631, sofern das nicht eine von Delphi erzeugte Nummer ist. Das Java Development Kit trägt die Versionnummer 1.8.0_60

Falls jemand helfen kann und noch weitere Infos erforderlich sind, bitte einfach fragen!
Wolfgang
  Mit Zitat antworten Zitat