JNI/c++ - passing imagefile as a byte array to native library

Discussion in 'C++' started by Guest, Jun 6, 2007.

  1. Guest

    Guest Guest

    Hi all,

    I am writing a sendmail milter application in Java. The incoming mails will
    usually have image file as attachments. My application is currently able to
    extract the ImageFile and save it on the filesystem. This part is working
    perfectly.

    ((MimeBodyPart)p).saveFile(new File(p.getFileName()));

    However, I would like to pass this file as a byte array to a c++ library
    instead and do the file saving and additional processing there instead. I
    know very little c++ though. Can someone help please? I am also not sure if
    the code I have written is doing what I think it is doing i.e. converting
    the file into a byte array and passing it to the native library.

    My current Java code is as following :

    private Boolean passToDLL(Part p, Boolean result) throws IOException {
    InputStream is = null;
    try {
    is = p.getInputStream();

    DataInputStream dis = new DataInputStream(is);
    String data = "";
    int size = dis.available();
    int offset = 0;
    do{
    byte [] byteArray = new byte[size];
    dis.read(byteArray, offset, size);
    data += new String(byteArray);
    offset = size + 1;
    size = dis.available();
    }while(size > 0);
    byte [] fileData = data.getBytes();
    result = passAttachment(fileData);
    } catch (MessagingException e) {
    e.printStackTrace();
    }
    finally{
    try {
    if (is != null)
    is.close();
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
    return result;
    }

    public native boolean passAttachment(byte[] buf);

    static { System.loadLibrary("hello");}


    My c++ code

    #include <jni.h>
    #include "MsgParser.h"
    #include <stdio.h>

    JNIEXPORT jboolean JNICALL Java_MsgParser_passAttachment
    (JNIEnv *env, jobject obj, jbyteArray array){

    // not sure what to do here to save image file data in bytearray to
    harddisk.

    }


    --
    Posted via a free Usenet account from http://www.teranews.com
     
    Guest, Jun 6, 2007
    #1
    1. Advertising

  2. Guest

    Alan Johnson Guest

    Re: [OT] JNI/c++ - passing imagefile as a byte array to native library

    wrote:
    > Hi all,
    >
    > I am writing a sendmail milter application in Java. The incoming mails will
    > usually have image file as attachments. My application is currently able to
    > extract the ImageFile and save it on the filesystem. This part is working
    > perfectly.
    >
    > ((MimeBodyPart)p).saveFile(new File(p.getFileName()));
    >
    > However, I would like to pass this file as a byte array to a c++ library
    > instead and do the file saving and additional processing there instead. I
    > know very little c++ though. Can someone help please? I am also not sure if
    > the code I have written is doing what I think it is doing i.e. converting
    > the file into a byte array and passing it to the native library.
    >


    This is off-topic for this comp.lang.c++. Setting followup to
    comp.lang.java.programmer.

    Perhaps this example will help in some way:

    // A.java
    class A
    {
    static
    {
    System.loadLibrary("A");
    }
    private native static void writeToFile(byte[] bytes);

    public static final void main(String[] args)
    {
    writeToFile("Hello, world!".getBytes());
    }
    }

    // A.cpp
    #include <jni.h>
    #include <cstddef>
    #include <new>

    // A wrapper class to ensure that GetByteArrayElements is always properly
    // paired with a ReleaseByteArrayElements.
    class jniByteArray
    {
    private:
    // Purposely not implemented to prevent copying.
    jniByteArray(const jniByteArray &);
    jniByteArray & operator=(const jniByteArray &);

    JNIEnv * m_env;
    jbyteArray m_byteArray;
    jbyte * m_bytes;
    jboolean m_isCopy;
    public:
    jniByteArray(JNIEnv * env, jbyteArray bytes)
    : m_env(env)
    , m_byteArray(bytes)
    , m_bytes(env->GetByteArrayElements(bytes, &m_isCopy))
    {
    if (!m_bytes)
    throw std::bad_alloc();
    }

    ~jniByteArray()
    {
    m_env->ReleaseByteArrayElements(m_byteArray, m_bytes, 0);
    }

    char * getBytes()
    {
    return reinterpret_cast<char *>(m_bytes);
    }

    std::size_t getSize() const
    {
    return std::size_t(m_env->GetArrayLength(m_byteArray));
    }

    bool isCopy() const
    {
    return bool(m_isCopy) ;
    }
    };

    #include <fstream>

    extern "C"
    JNIEXPORT void JNICALL Java_A_writeToFile(JNIEnv * env,
    jclass, jbyteArray bytes)
    {
    jniByteArray b(env, bytes);

    std::eek:fstream out("data.bin", std::ios::binary);
    out.write(b.getBytes(), b.getSize());
    }


    --
    Alan Johnson
     
    Alan Johnson, Jun 6, 2007
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kirby
    Replies:
    3
    Views:
    677
    Kirby
    Oct 8, 2004
  2. Replies:
    4
    Views:
    8,036
    tungjty
    Jun 22, 2011
  3. Guest
    Replies:
    2
    Views:
    2,033
    Guest
    Jun 7, 2007
  4. Silfheed

    PIL's ImageFile Parser and PNG's

    Silfheed, Nov 13, 2008, in forum: Python
    Replies:
    2
    Views:
    548
    Silfheed
    Nov 13, 2008
  5. bgabrhelik
    Replies:
    0
    Views:
    888
    bgabrhelik
    Sep 29, 2009
Loading...

Share This Page