Всем доброго времени суток! Сегодня мы разберем небольшой пример портирования кода с С++ на Delphi. Раз мы занялись JNI, то попутно все равно придется в дальнейшем учиться портировать код С++ на Delphi.
Итак, давайте же перейдем уже к примеру. Мы будем портировать некую Процедуру с С++ на Delphi. Вот как выглядит эта Процедура на С++:
А так код будет выглядеть на Delphi:
Итак, как вы уже заметили, я убрал некоторый мусор, который нам не нужен «printf(»%s", str);" и указал «Str» не Константой, а просто объявил как PAnsiChar, т.е. всегда есть некие модернизации кода и от них никуда не деться.
Итак, давайте же перейдем уже к примеру. Мы будем портировать некую Процедуру с С++ на 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)
Contriver
13.04.2017 11:57-2ух ты delphi, а я то думал его только в ВУЗах преподают
Автор вы преподаватель(исходя из стилистики написания), какой практический смыслСегодня мы разберем небольшой пример
?
Пациент delphi скорее мёртв, чем жив — вердикт программеров!
NeonMercury
«Беги, дядь Мить.» ©
А если по теме, то с какой целью написан этот пост?