- JAVA ile Delphi XE ön takısı ile sizlerle paylaşacağım ilk örnek AutoRun Örneği




- Aşağıdaki JAVA kaynak kodlarını bir dizi işlemden geçirerek classes.dex dosyasını elde edicez.

Kod: Tümünü seç
package com.arman.ornek;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
public class AutoRun extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent launchintent = new Intent();
launchintent.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
launchintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchintent);
}
}
Kod: Tümünü seç
c:\Program Files\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex
c:\Program Files\Embarcadero\RAD Studio\12.0\lib\android\release\classes.dex

Yeniden düzenlediğim "DEXHazirla.cmd" dosyası içeriğidir :

- Sorun olursa, SET ile ifade edilen klasör ve dosya isimlerini kendi sisteminizdeki kuruluma göre yeniden düzenlersiniz.

- setlocal ile set edildiğinden sisteminizde kalıcı PATH tanım değişikliği yaşamazsınız. Sadece bu komut dizisi içerisinde set edilir sonra da kendiliğinden unutulur.
Kod: Tümünü seç
@echo Offecho.
echo KULLANIM SEKLi: DEXhazirla src
echo.
Pause
setlocal
set ANDROID_JAR="C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\platforms\android-17\android.jar"
set DX_LIB="C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\build-tools\android-4.2.2\lib"
set EMBO_DEX="C:\Program Files\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex"
set PROJ_DIR=%CD%
set VERBOSE=0
set JAVASDK="C:\Program Files\Java\jdk1.7.0_25\bin"
set DX_BAT="C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\build-tools\android-4.2.2\dx.bat"
echo.
echo * Java kaynak kodlari derleniyor...
echo.
pause
mkdir output 2> nul
mkdir output\classes 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose
%JAVASDK%\javac %VERBOSE_FLAG% -Xlint:all -classpath %ANDROID_JAR% -d output\classes -source 1.6 -target 1.6 %1\*.java
echo.
echo.
echo * Yeni Class iceren JAR dosyasi Create ediliyor...
echo.
pause
mkdir output\jar 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=v
%JAVASDK%\jar c%VERBOSE_FLAG%f output\jar\arman_classes.jar -C output\classes com
echo.
echo * JAR dosyasi DEX dosyasina donusturuluyor...
echo.
pause
mkdir output\dex 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=--verbose
call %DX_BAT% --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\arman_classes.dex --positions=lines %PROJ_DIR%\output\jar\arman_classes.jar
echo.
echo * DEX dosyasinda birlestirme yapiliyor...
echo.
pause
%JAVASDK%\java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\arman_classes.dex %EMBO_DEX%
echo.
echo * Islem Tamam. output\dex\classes.dex dosyasini Delphi'nin varsayilan classes.dex dosyasi yerine kullanabilirsiniz...
echo * Lutfen "AndroidManifest.template.xml" dosyasina <receiver> tagina ekleme yapmayi unutmayin...
echo.
:Exit
endlocal

* Açılacak Deployment sayfasından aşağıdaki şekilde eski classes.dex başındaki işaret kutusu boşaltılıp yerine köşedeki minik butonlardan EKLEME için olana basarak JAVA klasörü altında OUTPUT\DEX klasöründeki yeni classes.dex dosyasını seçiyoruz.
* Remote Path olarak ".\" olarak belirecektir. Orayı mouse ile edit ederek eskisi ile aynı, yani classes\ ifadesini yazıyoruz.

* En son olarak da bir defalığına Project / Build All Project diyoruz ki projemize ait bir XML dosyası (AndroidManifest.template.xml) oluşturulsun.
* Bu XML dosyasına da bir ekleme yapıcaz...

* Aşağıdaki Manifest dosyasında 34 - 40 satırlar (dahil) aralığını biz ekledik.
* <%uses-permission%> gibi % işaretli olanlar Delphi tarafından boşluk doldurma şeklinde kendiliğinden doluyor. Biz Delphi'ye ait olmayan bir manipülasyon yaptığımızdan elle müdahale ediyoruz.
Kod: Tümünü seç
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="%package%"
android:versionCode="%versionCode%"
android:versionName="%versionName%">
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="%minSdkVersion%" />
<%uses-permission%>
<application android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:installLocation="%installLocation%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%">
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%"
android:configChanges="orientation|keyboardHidden">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="%libNameValue%" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
<receiver android:name="com.arman.ornek.AutoRun"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->

Kod: Tümünü seç
<receiver android:name="com.arman.ornek.AutoRun"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

- Direkt telefondan çalıştıracaksanız, öncelikle aşağıdaki resimdeki gibi Android / Target kısmında telefonunuzun göründüğünü ve mouse ile çift tıklayıp Active edildiğinden emin olun.

- Sonra da direkt CTRL + SHIFT + F9 veya "Run without Debugging" ile Telefona Deploy edin ve çalıştırın.
- Proje en az bir defa çalışınca, telefondan Ekle/Kaldır yapmadığınız sürece daima her açılışta yeniden başlayacaktır.
- Bu JAVA işlemini burada bir defalığına böyle resimlerle anlatıyorum.

- İlerleyen zamanlarda paylaşılacak diğer örneklerde (Service Programı nasıl yapılır, sistem olayları nasıl yakalanıp Delphi'ye aktarılır vb.) bu aşamaları anlatmayı pass geçip direkt JAVA, Delphi kaynak kodları ve XML Manifest dosyalarında yapılacakları konuşalım istiyorum.

* Metodoloji hep aynı çünkü. Herkese Android'li günler.

Başarılar.
