Всем доброго времени суток! Сегодня мы разберем небольшой пример портирования кода с С++ на Delphi. Раз мы занялись JNI, то попутно все равно придется в дальнейшем учиться портировать код С++ на Delphi.

Итак, давайте же перейдем уже к примеру. Мы будем портировать некую Процедуру с С++ на Delphi. Вот как выглядит эта Процедура на С++:

JNIEXPORT void JNICALL Java_JavaHowTo_sayHello
  (JNIEnv *env, jobject obj) {
    const char *str;
    jclass myclass_class =(jclass) env->NewGlobalRef 
         (env->FindClass ("MyClass"));
    // we need the MyClass constructor    
    jmethodID constructorID = env->GetMethodID
         (myclass_class, "", "()V");
    // and the sayHello() method
    jmethodID methodID = env->GetMethodID
         (myclass_class, "sayHello", "()Ljava/lang/String;");
    // instanciate a MyClass object
    jobject myclass_object =  env->NewObject
         (myclass_class, constructorID);
    // call the sayHello() method
    jstring s = (jstring)  env->CallObjectMethod
         (myclass_object, methodID);
    // convert the Java String to use it in C
    str = env->GetStringUTFChars(s, 0);
    printf("%s" , str);
    env->ReleaseStringUTFChars(s, str);  
    }

А так код будет выглядеть на Delphi:

procedure Java_JavaHowTo_sayHello(JNIEnv: PJNIEnv; Obj: JObject);
var
 myclass_class: JClass;
 constructorID, methodID: JMethodID;
 myclass_object: JObject;
 s: JString;
 Str: PAnsiChar;
begin
 myclass_class:= JNIenv^.NewGlobalRef(JNienv, JNIEnv^.FindClass(JNIEnv, 'MyClass'));
 // we need the MyClass constructor
 constructorID:= JNIEnv^.GetMethodID(JNIEnv, myclass_class, '', '()V');
 // and the sayHello() method
 methodID:= JNIEnv^.GetMethodID(JNIEnv, myclass_class, 'sayHello', '()Ljava/lang/String;');
 // instanciate a MyClass object
 myclass_object:= JNIEnv^.NewObject(JNIEnv, myclass_class, constructorID);
 // call the sayHello() method
 s:= JNIEnv^.CallObjectMethod(JNIEnv, myclass_object, methodID);
 // convert the Java String to use it in C
 str:= JNIEnv^.GetStringUTFChars(JNIEnv, s, 0);
 JNIEnv^.ReleaseStringUTFChars(JNIEnv, s, str);
end;

Итак, как вы уже заметили, я убрал некоторый мусор, который нам не нужен «printf(»%s", str);" и указал «Str» не Константой, а просто объявил как PAnsiChar, т.е. всегда есть некие модернизации кода и от них никуда не деться.
Поделиться с друзьями
-->

Комментарии (6)


  1. NeonMercury
    12.04.2017 20:30
    +11

    «Беги, дядь Мить.» ©
    А если по теме, то с какой целью написан этот пост?


  1. Lsh
    12.04.2017 23:10
    +5

    Я статью открыл, а она… кончилась. о_О


  1. samodum
    13.04.2017 00:30
    +2

    Вот и вся статья
    delphi_code = convert2Delphi(cpp_code);


  1. Antervis
    13.04.2017 09:35

    такая маленькая статья вызывает так много вопросов, и все "… но зачем?"


  1. Akon32
    13.04.2017 09:53
    +1

    Эпический HelloWorld!


  1. Contriver
    13.04.2017 11:57
    -2

    ух ты delphi, а я то думал его только в ВУЗах преподают
    Автор вы преподаватель(исходя из стилистики написания), какой практический смысл

    Сегодня мы разберем небольшой пример
    ?
    Пациент delphi скорее мёртв, чем жив — вердикт программеров!