Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как позвонить из Java для so библиотеки?


AliZairov

Вопрос

Здравствуйте. Я хотел бы позвонить из Java для создания и .so библиотеки с Delphi. Я получаю такие сообщения об ошибках

A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 16883 (com.nativefmx)
 

Оригинальный шаблон кода C.

#include <string.h>
#include <jni.h>
 
jstring 
Java_com_nativefmx_Main_getName(JNIEnv* pEnv, jobject pObj)
{
   return (*pEnv)->NewStringUTF(pEnv, "Hello NDK!");
}

 

Delphi код библиотеки.

library fmx;
 
uses
Androidapi.Jni;
 
function Java_com_nativefmx_Main_getName(pEnv: PJNIEnv; pObj: JNIObject): JNIString; cdecl;
begin
Result := (PEnv^).NewStringUTF(pEnv, MarshaledAString(Utf8Encode('Delphi Native String')));
end;
 
exports
Java_com_nativefmx_Main_getName;
  
begin
 
end.

 

Java код.

package com.nativefmx;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
 
public class Main extends Activity {
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(getName());
}
 
public native String getName();
 
static {
System.loadLibrary("fmx");
}
}

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Добрый вечер. Субъект актуальность. Я могу использовать сторону Delphi. Проблемы в использовании проектов Java. Пожалуйста, помогите. Примеры для Delph:

// hello.dpr (Console project) Compile copy project folder libhello.so

library hello; // Replace program function getYear: Integer; cdecl;
begin
  Result := 2017;
end;

exports
  getYear name 'getYear';

begin
end.

//Demo FMX Android app. Project->Deployment Add libhello.so path 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;

 

Изменено пользователем AliZairov
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...