سؤال

لدي DLL مكتوبة في C (لا أستطيع التحرير) الذي يحتوي على بعض النماذج الأولية التي تبدو

#include <stdio.h>
void foo(FILE *bar);

أرغب في إنشاء واجهة JNA إلى DLL ومن غير الواضح ما أحتاج إلى تمرير وسيطة شريط *. أفترض أنني بحاجة إلى اجتياز Inputstream (وهو تفضيلي)، لكن أدب JNA يبدو متنازع على هذا الموضوع.

كيف ستبدو واجهة Java؟ وماذا أحتاج حقا إلى المرور إلى فو؟

تحرير: Foo Postumes Bar هو نتيجة لعمليات FOPEN والمكالمات مثل FSCANF.

تحرير 2: في النهاية، لدي سلسلة في جافا أحتاج للقراءة في C كما لو كانت ملف، (والتي قد تكون سؤالا مختلفا تماما). من الناحية المثالية، أود تجنب كتابة الملف، وهذا هو السبب في أن تحويل Inputstream إلى مؤشر ملف C مرغوب فيه للغاية (ومن الواضح أن صعبة للغاية).

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

المحلول

لا أعتقد أنك تستطيع القيام بذلك - ليس لديك طريقة سهلة للوصول إلى Internals InputStream مثيل، وحتى FileInputStream على الأرجح لن يتم تنفيذها على رأس ملف Stdio *. لمعرفة ما يجب أن يكون واجهة Java الخاصة بك، ستحتاج إلى نشر المزيد عن foo وظيفة - ما يفعله وكيف تستخدمه.

إذا كنت لا تهتم بما FILE * فعلا، يمكنك كود استخدام jna للاتصال fopen, ، تمرير اسم الملف والوضع المفتوح، وتمرير النتيجة كقيمة غير شفافة foo, ، على سبيل المثال (pseudocode):

path = "MyFile.txt";
bar = Libc.fopen(path, "r");
Libfoo.foo(bar);

تحديث: إذا كنت بحاجة إلى الحصول على سلسلة تحتوي على بيانات تحتاج معالجتها كما لو كانت في ملف، أعتقد أنك خارج الحظ. لسوء الحظ، لا يتم بناء مكتبة C القياسية على قمة تجريد دفق، مما يعني أنه من غير المرجح أن تكون قادرا على تحقيق ما تريده إلا إذا كنت تستطيع فتح ما يشبه اسم الملف ولكنه يؤدي إلى بيانات السلسلة الخاصة بك؛ ومع ذلك، سيكون من الأسهل كثيرا عن الرصاصة وحفظ السلسلة إلى ملف مؤقت، ثم افتح ذلك fopen :-(

نصائح أخرى

على أنظمة Posix، يمكنك القيام بذلك باستخدام أنبوب، طالما أن السلسلة ليست طويلة جدا (لسوء الحظ "طويل جدا" يعتمد على خصائص نظام التشغيل، ولكنه لا يقل عن 512 بايت):

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int string_to_foo(const char *str, size_t len)
{
    int pipefd[2];
    FILE *infile;

    if (len > PIPE_BUF)
    {
        /* Error - string possibly too long */
        return -1;
    }

    if (pipe(pipefd))
    {
        /* Error - pipe() failed */
        return -1;
    }

    if (write(pipefd[1], str, len) < len)
    {
        close(pipefd[0]);
        close(pipefd[1]);

        /* Error - write() failed */
        return -1;
    }

    close(pipefd[1]);

    infile = fdopen(pipefd[0], "r");

    if (!infile)
    {
        close(pipefd[0]);

        /* Error - fdopen() failed */
        return -1;
    }

    foo(infile);

    fclose(infile);

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