title: JNI in C++ to read file to jbyteArray
body: <p>I am writing a C++ program in UNIX to generate a shared library which will be called in java using JNI. This C++ program has to read a file in UNIX box then it will have to be converted into <code>jbyteArray</code> (JNI data type) so that JAVA can use it. </p>
  
  <p>I read the file in C++ into <code>char*</code> but could not convert into <code>jbyteArray</code>. Please help it.</p>
  
  <p>Code is below::</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;fstream&gt;
  #include &lt;stdio.h&gt;
  #include "com_sp_dll_NativeMethods.h"   // this header file was generated by java
  
  using namespace std;
  
  JNIEXPORT void JNICALL Java_HelloWorld_displayMessage(JNIEnv *env, jobject obj)
  {
      printf("Hello World!\n");
  }
  
  JNIEXPORT jbyteArray JNICALL Java_com_sp_dll_NativeMethods_getFile(JNIEnv *env, jobject obj)
  {
      ifstream fl("/home/rkannan/myFile.txt");
      fl.seekg(0, ios::end );
      size_t len = fl.tellg();
      char *ret = new char[len];
      fl.seekg(0, ios::beg);
      fl.read(ret, len);
      fl.close();
  
      int i = 0;
      jbyte *a1 = null;
  
      while(ret[i] != '\0'){
          cout&lt;&lt;ret[i];
          al[i] = ret[i];
          i++;
      }
  
      jbyteArray result = env-&gt;NewByteArray( len);
      env-&gt;SetByteArrayRegion( result, 0, len, (const jbyte*) ret );
      delete[] ret;
      return result;
    }
  </code></pre>
  
  <p>The error is as follows</p>
  
  <pre><code>bash-3.00$ g++ -I /usr/jdk/instances/jdk1.5.0/include -I /usr/jdk/instances/jdk1.5.0/include/solaris -o libSample.so -shared com_sp_dll_NativeMethods.cpp
          Text relocation remains                         referenced
              against symbol                  offset      in file
          std::__ioinit                       0x550       /var/tmp//ccKCiEKq.o
          std::__ioinit                       0x554       /var/tmp//ccKCiEKq.o
          std::__ioinit                       0x588       /var/tmp//ccKCiEKq.o
          std::__ioinit                       0x58c       /var/tmp//ccKCiEKq.o
          .rodata (section)                   0x204       /var/tmp//ccKCiEKq.o
          .rodata (section)                   0x208       /var/tmp//ccKCiEKq.o
          .rodata (section)                   0x244       /var/tmp//ccKCiEKq.o
          .rodata (section)                   0x248       /var/tmp//ccKCiEKq.o
          .rodata (section)                   0x2f4       /var/tmp//ccKCiEKq.o
          .rodata (section)                   0x2f8       /var/tmp//ccKCiEKq.o
          std::fpos&lt;__mbstate_t&gt;::operator long long() const0x348         /var/tmp//ccKCiEKq.o
          std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp; std::operator&lt;&lt; &lt;std::char_traits&lt;char&gt; &gt;(std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;, char)0x400             /var/tmp//ccKCiEKq.o
          std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp; std::operator&lt;&lt; &lt;std::char_traits&lt;char&gt; &gt;(std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;, char const*)0x2cc      /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::is_open()0x260      /var/tmp//ccKCiEKq.o
          std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;::read(char*, int)0x39c        /var/tmp//ccKCiEKq.o
          JNIEnv_::SetByteArrayRegion(_jbyteArray*, int, int, signed char const*)0x468            /var/tmp//ccKCiEKq.o
          operator new[](unsigned int)        0x364       /var/tmp//ccKCiEKq.o
          std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;::seekg(long long, std::_Ios_Seekdir)0x31c             /var/tmp//ccKCiEKq.o
          std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;::seekg(long long, std::_Ios_Seekdir)0x384             /var/tmp//ccKCiEKq.o
          std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;&amp; std::operator&gt;&gt;&lt;char, std::char_traits&lt;char&gt; &gt;(std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;, char*)0x2b4       /var/tmp//ccKCiEKq.o
          printf                              0x20c       /var/tmp//ccKCiEKq.o
          JNIEnv_::NewByteArray(int)          0x444       /var/tmp//ccKCiEKq.o
          std::ios_base::Init::Init()         0x558       /var/tmp//ccKCiEKq.o
          std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::size() const0x14        /var/tmp//ccKCiEKq.o
          std::cout                           0x2c0       /var/tmp//ccKCiEKq.o
          std::cout                           0x2c4       /var/tmp//ccKCiEKq.o
          std::cout                           0x3f4       /var/tmp//ccKCiEKq.o
          std::cout                           0x3f8       /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ifstream()0x234       /var/tmp//ccKCiEKq.o
          std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::operator[](unsigned int) const0x9c              /var/tmp//ccKCiEKq.o
          std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::operator[](unsigned int) const0x128             /var/tmp//ccKCiEKq.o
          std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::operator[](unsigned int) const0x184             /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::open(char const*, std::_Ios_Openmode)0x250          /var/tmp//ccKCiEKq.o
          std::ios_base::Init::~Init()        0x590       /var/tmp//ccKCiEKq.o
          std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;::eof() const0x288         /var/tmp//ccKCiEKq.o
          unsigned int const&amp; std::min&lt;unsigned int&gt;(unsigned int const&amp;, unsigned int const&amp;)0x44        /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::~basic_ifstream()0x49c      /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::~basic_ifstream()0x4ac      /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::~basic_ifstream()0x4d4      /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::~basic_ifstream()0x4f8      /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::close()0x2e4        /var/tmp//ccKCiEKq.o
          std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::close()0x3ac        /var/tmp//ccKCiEKq.o
             std::basic_ifstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ifstream(char const*,     std::_Ios_Openmode)0x300        /var/tmp//ccKCiEKq.o
              operator delete[](void*)            0x484       /var/tmp//ccKCiEKq.o
             std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;::tellg()       0x334         /var/tmp//ccKCiEKq.o
              _Unwind_Resume                      0x508       /var/tmp//ccKCiEKq.o
              ld: fatal: relocations remain against allocatable but non-writable sections
              collect2: ld returned 1 exit status
  </code></pre>