Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
[ÇÖZÜLDÜ] Android kütüphane kullanımı
#1
Günaydın. Android native kodlamayı test ediyorum. Şimdi A.Studio için NDK HelloJNI örneğine bakarak delphide console projesinde .so build etdim.

Edit: Çözüldü

1. hello isimli console projesi oluşturdum ve örnek bu kodları yazdım. Sadece compile etdim .so kütüphane üretmesi için.
library hello; // burada program yazıyor onu library yapın

function getYear: Integer; cdecl;
begin
 Result := 2017;
end;

exports
 getYear name 'getYear';

begin
end.

2. Bir FMX projesi oluşturdum. Project->Deployment bölümüne libhello.so ekeldim. Dosya yolu library\lib\armeabi-v7a\

uses
  System.IOUtils;

var
 Path: string;
 FLib: THandle;
 getYear: function: Integer; cdecl;

procedure loadLib(const name: string);
begin
 Path := IncludeTrailingPathDelimiter(TPath.GetLibraryPath);
 FLib := LoadLibrary(PChar(Path + 'lib' + name + '.so'));
end;

procedure TMain.Button1Click(Sender: TObject);
begin
 loadLib('hello'); // libhello.so
 if FLib <> 0 then
 begin
   getYear := GetProcAddress(Flib, 'getYear');
   ShowMessage(IntToStr(getYear()));
 end;
end;
WWW
Cevapla
#2
Görünen o ki; bahse konu library'i, tanımlı olan path'ler içinde bulamamış. Yol tanımını vererek loadlibrary ile yüklemeyi deneyebilir misiniz ?
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
(28-03-2017, Saat: 09:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Görünen o ki; bahse konu library'i, tanımlı olan path'ler içinde bulamamış. Yol tanımını vererek loadlibrary ile yüklemeyi deneyebilir misiniz ?

Merhaba. Libary isminden kaynaklanıyormuş bulamama. libAndroid.so dosyasını çağırmak için tek Android yazmak gerekmiş. Onu düzeltdim ama bir olay daha var. Bu fonksiyonu register yapmak. Ben console projesi açtığımdan bazı delphi yazılım stillerini çalıştıramadım.

program Android;

//interface

uses
 Androidapi.JNI,
 Androidapi.JNIBridge,
 Androidapi.JNI.JavaTypes;
 
//implementation

function StringToJString(const Str: string): JString;
var
 LocalRef: JNIObject;
 PEnv: PJNIEnv;
begin
 PEnv := TJNIResolver.GetJNIEnv;
 LocalRef := StringToJNIString(PEnv, Str);
 Result := TJString.Wrap(LocalRef);
 PEnv^.DeleteLocalRef(PEnv, LocalRef);
end;

function stringFromJNI(PEnv: PJNIEnv; This: JNIObject): JString; cdecl;
begin
 Result:= StringToJSTring('Hello from Delphi');
end;

{
procedure RegisterNativeMethods;
var
 PEnv: PJNIEnv;
 zClass: JNIClass;
 NativeMethod: JNINativeMethod;
begin
 PEnv := TJNIResolver.GetJNIEnv;
 NativeMethod.Name := 'stringFromJNI';
 NativeMethod.Signature := '(I)Ljava/lang/String;';
 NativeMethod.FnPtr := @stringFromJNI;
 zClass := TJNIResolver.GetJavaClassID('com.zs.hellojni.MainActivity');
 if zClass <> nil then
 begin
   PEnv^.RegisterNatives(PEnv, zClass, @NativeMethod, 1);
   PEnv^.DeleteLocalRef(PEnv, zClass);
 end;
end;
}

exports
stringFromJNI name 'Java_com_zs_hellojni_MainActivity_stringFromJNI';

//initialization
 //RegisterNativeMethods;
 
begin

end.

RegisterNativeMethods fonksiyonu kayıt etmem gerekiyor ama console projesi initialization desteklemiyor.
WWW
Cevapla
#4
İyi akşamlar. O kadar uğraştan sonra java tarafında olmasada delphi tarafında çözüme ulaştım. Konu güncelledim.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Android Rehbere Kayıt Ekleme barissagir 6 301 04-04-2024, Saat: 09:36
Son Yorum: RAD Coder
  Android’de Dosya Depolama ve Paylaşma-2: And 11 SDK 30 Scoped Storage SAF MediaStore emozgun 12 4.906 19-03-2024, Saat: 22:29
Son Yorum: nguzeller
  Web butona tıklama - Çözüldü Altıner 2 218 13-03-2024, Saat: 16:42
Son Yorum: Altıner
  Google play Uygulama yükleme hatası [Çözüldü] codder71 3 364 23-02-2024, Saat: 22:42
Son Yorum: codder71
  Delphi 12 Boş Form Derleme Hatası [Çözüldü] codder71 4 536 21-02-2024, Saat: 22:09
Son Yorum: codder71



Konuyu Okuyanlar: 1 Ziyaretçi