Всем доброго времени суток! Сегодня мы разберем небольшой пример портирования кода с С++ на 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/
Добавить комментарий