سؤال

كيف يمكننا الأنواع البدائية الجديدة في JNI. لدي وظيفة ترجع أ jobject. من الممكن العودة jint, jchar, ، إلخ.

هنالك NewString, ، لما لا NewInteger, NewCharacter, NewDouble, ، إلخ. لا يوجد تلقائي في طبقة JNI في الوقت الحالي.

يمكنني الذهاب مع NewObject اتصل ، ولكن هذا سيكون الكثير من النفقات العامة لإنشاء أنواع بدائية.

jobject NewInteger(JNIEnv* env, jint value)
{
    jclass cls = FindClass(env, "java/lang/Integer");
    jmethodID methodID = GetMethodID(env, cls, "<init>", "(I)V", false);
    return env->NewObject(cls, methodID, value);
}

لدي وظائف غلاف للحصول على الفصل والموضوع.

هل كانت مفيدة؟

المحلول

jint, jdouble, وما إلى ذلك jobjects. كما تقول ، إنها متغيرات بدائية. فقط املأهم!

jint someInt = 1;
jdouble someDouble = 3.14159;

إعادة تحرير: أرى ، تريد العودة وضع في صندوق أنواع مثل Integer, Double, ، وما إلى ذلك ، نعم ، ربما تكون وظيفة Wrapper التي نشرتها هي الطريق للذهاب.

نصائح أخرى

لماذا تشعر أن هذا النهج هو "الكثير من النفقات العامة"؟ إذا كنت ترغب في إرجاع قيمة محاصر (وهو كائن يحمل بدائيًا ، وليس "نوعًا بدائيًا") ، فأنت بحاجة إلى إنشاء هذا الكائن.

بديل واحد هو استدعاء valueOf() طريقة على نوع الغلاف.

ومع ذلك ، أعتقد أنك أفضل حالًا في إرجاع القيمة البدائية الفعلية ، والسماح لها بالتعبئة (إذا كنت بحاجة إلى ذلك) بمجرد أن تكون على جانب Java.


إذا كنت قلقًا بشأن النفقات العامة للبحث عن الوظيفة/مُنشئ ، فيجب عليك ذاكرة التخزين المؤقت لمعرفات الطريقة. على عكس مؤشرات الكائنات ، لن تتغير (مع بعض الفئات التي تم تفريغها التي لا تنطبق على الأغلفة البدائية). انظر البند 10.7 هنا: http://java.sun.com/docs/books/jni/html/pitfalls.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top