كيفية إنشاء وهمية JNIEnv في C / C ++
-
03-07-2019 - |
سؤال
وأنا أكتب بعض رمز JNI في C أود أن اختبار باستخدام كونيت. من أجل استدعاء وظائف JNI، ولست بحاجة إلى إنشاء بنية JNIEnv صالحة.
لا أحد يعرف إذا كان هناك إطار ساخرا لهذا الغرض، أو الذين يمكن أن تعطيني بعض المؤشرات على كيفية إنشاء JNIEnv همية البنية نفسي؟
المحلول
وjni.h يحتوي على بنية كاملة لJNIEnv_، بما في ذلك "القفز الجدول" JNINativeInterface_. هل يمكن إنشاء JNINativeInterface_ بنفسك (مشيرا إلى تطبيقات وهمية) ومثيل JNIEnv_ منه.
وتحرير ردا على تصريحات: (أنا لا تبدو في الطرف الآخر SO سؤال المرجعية)
#include "jni.h"
#include <iostream>
jint JNICALL MockGetVersion(JNIEnv *)
{
return 23;
}
JNINativeInterface_ jnini = {
0, 0, 0, 0, //4 reserved pointers
MockGetVersion
};
// class Foo { public static native void bar(); }
void Java_Foo_bar(JNIEnv* jni, jclass)
{
std::cout << jni->GetVersion() << std::endl;
}
int main()
{
JNIEnv_ myjni = {&jnini};
Java_Foo_bar(&myjni, 0);
return 0;
}
نصائح أخرى
والهزء JNI يبدو وكأنه عالم من الألم بالنسبة لي. أعتقد أنك من المحتمل أن تكون أفضل حالا ساخرا من دعوات تنفيذها في جاوة، واستخدام أداة JUnit لاختبار وظيفة على الجانب جافا
اقتباس: ".. ويتم تنفيذ jnimock على رأس gmock ويوفر فئتين C ++" JNIEnvMock "و" JavaVMMock "لوهمية على حدة" JNIEnv "و" JavaVM "