abhi_
@gmx.net 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::ofstream out("data.bin", std::ios::binary);
out.write(b.getBytes(), b.getSize());
}
--
Alan Johnson