JNI и Delphi. Портирование кода с C++ на Delphi

от автора

Всем доброго времени суток! Сегодня мы разберем небольшой пример портирования кода с С++ на 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 т.е. всегда есть некие модернизации кода и от них никуда не деться =)
ссылка на оригинал статьи https://habrahabr.ru/post/326364/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *