page.title=JNI Tips
page.tags=ndk,native

page.article=true
@jd:body

<div id="tb-wrapper">
<div id="tb">

<h2>In this document</h2>
<ol class="nolist">
  <li><a href="#JavaVM_and_JNIEnv">JavaVM and JNIEnv</a></li>
  <li><a href="#threads">Threads</a></li>
  <li><a href="#jclass_jmethodID_and_jfieldID">jclass, jmethodID, and jfieldID</a></li>
  <li><a href="#local_and_global_references">Local and Global References</a></li>
  <li><a href="#UTF_8_and_UTF_16_strings">UTF-8 and UTF-16 Strings</a></li>
  <li><a href="#arrays">Primitive Arrays</a></li>
  <li><a href="#region_calls">Region Calls</a></li>
  <li><a href="#exceptions">Exceptions</a></li>
  <li><a href="#extended_checking">Extended Checking</a> </li>
  <li><a href="#native_libraries">Native Libraries</a></li>
  <li><a href="#64_bit">64-bit Considerations</a></li>
  <li><a href="#unsupported">Unsupported Features/Backwards Compatibility</a></li>
  <li><a href="#faq_ULE">FAQ: Why do I get <code>UnsatisfiedLinkError</code></a></li>
  <li><a href="#faq_FindClass">FAQ: Why didn't <code>FindClass</code> find my class?</a></li>
  <li><a href="#faq_sharing">FAQ: How do I share raw data with native code?</a></li>
</ol>

</div>
</div>

<p>JNI is the Java Native Interface.  It defines a way for managed code
(written in the Java programming language) to interact with native
code (written in C/C++).  It's vendor-neutral, has support for loading code from
dynamic shared libraries, and while cumbersome at times is reasonably efficient.</p>

<p>If you're not already familiar with it, read through the
<a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html">Java Native Interface Specification</a>
to get a sense for how JNI works and what features are available.  Some
aspects of the interface aren't immediately obvious on
first reading, so you may find the next few sections handy.</p>


<a name="JavaVM_and_JNIEnv" id="JavaVM_and_JNIEnv"></a>
<h2>JavaVM and JNIEnv</h2>

<p>JNI defines two key data structures, "JavaVM" and "JNIEnv".  Both of these are essentially
pointers to pointers to function tables.  (In the C++ version, they're classes with a
pointer to a function table and a member function for each JNI function that indirects through
the table.)  The JavaVM provides the "invocation interface" functions,
which allow you to create and destroy a JavaVM.  In theory you can have multiple JavaVMs per process,
but Android only allows one.</p>

<p>The JNIEnv provides most of the JNI functions.  Your native functions all receive a JNIEnv as
the first argument.</p>

<p>The JNIEnv is used for thread-local storage.  For this reason, <strong>you cannot share a JNIEnv between threads</strong>.
If a piece of code has no other way to get its JNIEnv, you should share
the JavaVM, and use <code>GetEnv</code> to discover the thread's JNIEnv. (Assuming it has one; see <code>AttachCurrentThread</code> below.)</p>

<p>The C declarations of JNIEnv and JavaVM are different from the C++
declarations.  The <code>"jni.h"</code> include file provides different typedefs
depending on whether it's included into C or C++.  For this reason it's a bad idea to
include JNIEnv arguments in header files included by both languages.  (Put another way: if your
header file requires <code>#ifdef __cplusplus</code>, you may have to do some extra work if anything in
that header refers to JNIEnv.)</p>

<a name="threads" id="threads"></a>
<h2>Threads</h2>

<p>All threads are Linux threads, scheduled by the kernel.  They're usually
started from managed code (using <code>Thread.start</code>),
but they can also be created elsewhere and then attached to the JavaVM.  For
example, a thread started with <code>pthread_create</code> can be attached
with the JNI <code>AttachCurrentThread</code> or
<code>AttachCurrentThreadAsDaemon</code> functions.  Until a thread is
attached, it has no JNIEnv, and <strong>cannot make JNI calls</strong>.</p>

<p>Attaching a natively-created thread causes a <code>java.lang.Thread</code>
object to be constructed and added to the "main" <code>ThreadGroup</code>,
making it visible to the debugger.  Calling <code>AttachCurrentThread</code>
on an already-attached thread is a no-op.</p>

<p>Android does not suspend threads executing native code.  If
garbage collection is in progress, or the debugger has issued a suspend
request, Android will pause the thread the next time it makes a JNI call.</p>

<p>Threads attached through JNI <strong>must call
<code>DetachCurrentThread</code> before they exit</strong>.
If coding this directly is awkward, in Android 2.0 (Eclair) and higher you
can use <code>pthread_key_create</code> to define a destructor
function that will be called before the thread exits, and
call <code>DetachCurrentThread</code> from there.  (Use that
key with <code>pthread_setspecific</code> to store the JNIEnv in
thread-local-storage; that way it'll be passed into your destructor as
the argument.)</p>


<a name="jclass_jmethodID_and_jfieldID" id="jclass_jmethodID_and_jfieldID"></a>
<h2>jclass, jmethodID, and jfieldID</h2>

<p>If you want to access an object's field from native code, you would do the following:</p>

<ul>
<li> Get the class object reference for the class with <code>FindClass</code></li>
<li> Get the field ID for the field with <code>GetFieldID</code></li>
<li> Get the contents of the field with something appropriate, such as
<code>GetIntField</code></li>
</ul>

<p>Similarly, to call a method, you'd first get a class object reference and then a method ID.  The IDs are often just
pointers to internal runtime data structures.  Looking them up may require several string
comparisons, but once you have them the actual call to get the field or invoke the method
is very quick.</p>

<p>If performance is important, it's useful to look the values up once and cache the results
in your native code.  Because there is a limit of one JavaVM per process, it's reasonable
to store this data in a static local structure.</p>

<p>The class references, field IDs, and method IDs are guaranteed valid until the class is unloaded.  Classes
are only unloaded if all classes associated with a ClassLoader can be garbage collected,
which is rare but will not be impossible in Android.  Note however that
the <code>jclass</code>
is a class reference and <strong>must be protected</strong> with a call
to <code>NewGlobalRef</code> (see the next section).</p>

<p>If you would like to cache the IDs when a class is loaded, and automatically re-cache them
if the class is ever unloaded and reloaded, the correct way to initialize
the IDs is to add a piece of code that looks like this to the appropriate class:</p>

<pre>    /*
     * We use a class initializer to allow the native code to cache some
     * field offsets. This native function looks up and caches interesting
     * class/field/method IDs. Throws on failure.
     */
    private static native void nativeInit();

    static {
        nativeInit();
    }</pre>

<p>Create a <code>nativeClassInit</code> method in your C/C++ code that performs the ID lookups.  The code
will be executed once, when the class is initialized.  If the class is ever unloaded and
then reloaded, it will be executed again.</p>

<a name="local_and_global_references" id="local_and_global_references"></a>
<h2>Local and Global References</h2>

<p>Every argument passed to a native method, and almost every object returned
by a JNI function is a "local reference".  This means that it's valid for the
duration of the current native method in the current thread.
<strong>Even if the object itself continues to live on after the native method
returns, the reference is not valid.</strong>
<p>This applies to all sub-classes of <code>jobject</code>, including
<code>jclass</code>, <code>jstring</code>, and <code>jarray</code>.
(The runtime will warn you about most reference mis-uses when extended JNI
checks are enabled.)</p>
<p>The only way to get non-local references is via the functions
<code>NewGlobalRef</code> and <code>NewWeakGlobalRef</code>.

<p>If you want to hold on to a reference for a longer period, you must use
a "global" reference.  The <code>NewGlobalRef</code> function takes the
local reference as an argument and returns a global one.
The global reference is guaranteed to be valid until you call
<code>DeleteGlobalRef</code>.</p>

<p>This pattern is commonly used when caching a jclass returned
from <code>FindClass</code>, e.g.:</p>
<pre>jclass localClass = env-&gt;FindClass("MyClass");
jclass globalClass = reinterpret_cast&lt;jclass&gt;(env-&gt;NewGlobalRef(localClass));</pre>

<p>All JNI methods accept both local and global references as arguments.
It's possible for references to the same object to have different values.
For example, the return values from consecutive calls to
<code>NewGlobalRef</code> on the same object may be different.
<strong>To see if two references refer to the same object,
you must use the <code>IsSameObject</code> function.</strong>  Never compare
references with <code>==</code> in native code.</p>

<p>One consequence of this is that you
<strong>must not assume object references are constant or unique</strong>
in native code.  The 32-bit value representing an object may be different
from one invocation of a method to the next, and it's possible that two
different objects could have the same 32-bit value on consecutive calls.  Do
not use <code>jobject</code> values as keys.</p>

<p>Programmers are required to "not excessively allocate" local references.  In practical terms this means
that if you're creating large numbers of local references, perhaps while running through an array of
objects, you should free them manually with
<code>DeleteLocalRef</code> instead of letting JNI do it for you.  The
implementation is only required to reserve slots for
16 local references, so if you need more than that you should either delete as you go or use
<code>EnsureLocalCapacity</code>/<code>PushLocalFrame</code> to reserve more.</p>

<p>Note that <code>jfieldID</code>s and <code>jmethodID</code>s are opaque
types, not object references, and should not be passed to
<code>NewGlobalRef</code>.  The raw data
pointers returned by functions like <code>GetStringUTFChars</code>
and <code>GetByteArrayElements</code> are also not objects. (They may be passed
between threads, and are valid until the matching Release call.)</p>

<p>One unusual case deserves separate mention.  If you attach a native
thread with <code>AttachCurrentThread</code>, the code you are running will
never automatically free local references until the thread detaches.  Any local
references you create will have to be deleted manually. In general, any native
code that creates local references in a loop probably needs to do some manual
deletion.</p>

<a name="UTF_8_and_UTF_16_strings" id="UTF_8_and_UTF_16_strings"></a>
<h2>UTF-8 and UTF-16 Strings</h2>

<p>The Java programming language uses UTF-16.  For convenience, JNI provides methods that work with <a href="http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8">Modified UTF-8</a> as well.  The
modified encoding is useful for C code because it encodes \u0000 as 0xc0 0x80 instead of 0x00.
The nice thing about this is that you can count on having C-style zero-terminated strings,
suitable for use with standard libc string functions.  The down side is that you cannot pass
arbitrary UTF-8 data to JNI and expect it to work correctly.</p>

<p>If possible, it's usually faster to operate with UTF-16 strings. Android
currently does not require a copy in <code>GetStringChars</code>, whereas
<code>GetStringUTFChars</code> requires an allocation and a conversion to
UTF-8.  Note that
<strong>UTF-16 strings are not zero-terminated</strong>, and \u0000 is allowed,
so you need to hang on to the string length as well as
the jchar pointer.</p>

<p><strong>Don't forget to <code>Release</code> the strings you <code>Get</code></strong>.  The
string functions return <code>jchar*</code> or <code>jbyte*</code>, which
are C-style pointers to primitive data rather than local references.  They
are guaranteed valid until <code>Release</code> is called, which means they are not
released when the native method returns.</p>

<p><strong>Data passed to NewStringUTF must be in Modified UTF-8 format</strong>.  A
common mistake is reading character data from a file or network stream
and handing it to <code>NewStringUTF</code> without filtering it.
Unless you know the data is 7-bit ASCII, you need to strip out high-ASCII
characters or convert them to proper Modified UTF-8 form.  If you don't,
the UTF-16 conversion will likely not be what you expect.  The extended
JNI checks will scan strings and warn you about invalid data, but they
won't catch everything.</p>

<a name="arrays" id="arrays"></a>
<h2>Primitive Arrays</h2>

<p>JNI provides functions for accessing the contents of array objects.
While arrays of objects must be accessed one entry at a time, arrays of
primitives can be read and written directly as if they were declared in C.</p>

<p>To make the interface as efficient as possible without constraining
the VM implementation, the <code>Get&lt;PrimitiveType&gt;ArrayElements</code>
family of calls allows the runtime to either return a pointer to the actual elements, or
allocate some memory and make a copy.  Either way, the raw pointer returned
is guaranteed to be valid until the corresponding <code>Release</code> call
is issued (which implies that, if the data wasn't copied, the array object
will be pinned down and can't be relocated as part of compacting the heap).
<strong>You must <code>Release</code> every array you <code>Get</code>.</strong>  Also, if the <code>Get</code>
call fails, you must ensure that your code doesn't try to <code>Release</code> a NULL
pointer later.</p>

<p>You can determine whether or not the data was copied by passing in a
non-NULL pointer for the <code>isCopy</code> argument.  This is rarely
useful.</p>

<p>The <code>Release</code> call takes a <code>mode</code> argument that can
have one of three values.  The actions performed by the runtime depend upon
whether it returned a pointer to the actual data or a copy of it:</p>

<ul>
    <li><code>0</code>
    <ul>
        <li>Actual: the array object is un-pinned.
        <li>Copy: data is copied back.  The buffer with the copy is freed.
    </ul>
    <li><code>JNI_COMMIT</code>
    <ul>
        <li>Actual: does nothing.
        <li>Copy: data is copied back.  The buffer with the copy
        <strong>is not freed</strong>.
    </ul>
    <li><code>JNI_ABORT</code>
    <ul>
        <li>Actual: the array object is un-pinned.  Earlier
        writes are <strong>not</strong> aborted.
        <li>Copy: the buffer with the copy is freed; any changes to it are lost.
    </ul>
</ul>

<p>One reason for checking the <code>isCopy</code> flag is to know if
you need to call <code>Release</code> with <code>JNI_COMMIT</code>
after making changes to an array &mdash; if you're alternating between making
changes and executing code that uses the contents of the array, you may be
able to
skip the no-op commit.  Another possible reason for checking the flag is for
efficient handling of <code>JNI_ABORT</code>.  For example, you might want
to get an array, modify it in place, pass pieces to other functions, and
then discard the changes.  If you know that JNI is making a new copy for
you, there's no need to create another "editable" copy.  If JNI is passing
you the original, then you do need to make your own copy.</p>

<p>It is a common mistake (repeated in example code) to assume that you can skip the <code>Release</code> call if
<code>*isCopy</code> is false.  This is not the case.  If no copy buffer was
allocated, then the original memory must be pinned down and can't be moved by
the garbage collector.</p>

<p>Also note that the <code>JNI_COMMIT</code> flag does <strong>not</strong> release the array,
and you will need to call <code>Release</code> again with a different flag
eventually.</p>


<a name="region_calls" id="region_calls"></a>
<h2>Region Calls</h2>

<p>There is an alternative to calls like <code>Get&lt;Type&gt;ArrayElements</code>
and <code>GetStringChars</code> that may be very helpful when all you want
to do is copy data in or out.  Consider the following:</p>

<pre>    jbyte* data = env-&gt;GetByteArrayElements(array, NULL);
    if (data != NULL) {
        memcpy(buffer, data, len);
        env-&gt;ReleaseByteArrayElements(array, data, JNI_ABORT);
    }</pre>

<p>This grabs the array, copies the first <code>len</code> byte
elements out of it, and then releases the array.  Depending upon the
implementation, the <code>Get</code> call will either pin or copy the array
contents.
The code copies the data (for perhaps a second time), then calls <code>Release</code>; in this case
<code>JNI_ABORT</code> ensures there's no chance of a third copy.</p>

<p>One can accomplish the same thing more simply:</p>
<pre>    env-&gt;GetByteArrayRegion(array, 0, len, buffer);</pre>

<p>This has several advantages:</p>
<ul>
    <li>Requires one JNI call instead of 2, reducing overhead.
    <li>Doesn't require pinning or extra data copies.
    <li>Reduces the risk of programmer error &mdash; no risk of forgetting
    to call <code>Release</code> after something fails.
</ul>

<p>Similarly, you can use the <code>Set&lt;Type&gt;ArrayRegion</code> call
to copy data into an array, and <code>GetStringRegion</code> or
<code>GetStringUTFRegion</code> to copy characters out of a
<code>String</code>.


<a name="exceptions" id="exceptions"></a>
<h2>Exceptions</h2>

<p><strong>You must not call most JNI functions while an exception is pending.</strong>
Your code is expected to notice the exception (via the function's return value,
<code>ExceptionCheck</code>, or <code>ExceptionOccurred</code>) and return,
or clear the exception and handle it.</p>

<p>The only JNI functions that you are allowed to call while an exception is
pending are:</p>
<ul>
    <li><code>DeleteGlobalRef</code>
    <li><code>DeleteLocalRef</code>
    <li><code>DeleteWeakGlobalRef</code>
    <li><code>ExceptionCheck</code>
    <li><code>ExceptionClear</code>
    <li><code>ExceptionDescribe</code>
    <li><code>ExceptionOccurred</code>
    <li><code>MonitorExit</code>
    <li><code>PopLocalFrame</code>
    <li><code>PushLocalFrame</code>
    <li><code>Release&lt;PrimitiveType&gt;ArrayElements</code>
    <li><code>ReleasePrimitiveArrayCritical</code>
    <li><code>ReleaseStringChars</code>
    <li><code>ReleaseStringCritical</code>
    <li><code>ReleaseStringUTFChars</code>
</ul>

<p>Many JNI calls can throw an exception, but often provide a simpler way
of checking for failure.  For example, if <code>NewString</code> returns
a non-NULL value, you don't need to check for an exception.  However, if
you call a method (using a function like <code>CallObjectMethod</code>),
you must always check for an exception, because the return value is not
going to be valid if an exception was thrown.</p>

<p>Note that exceptions thrown by interpreted code do not unwind native stack
frames, and Android does not yet support C++ exceptions.
The JNI <code>Throw</code> and <code>ThrowNew</code> instructions just
set an exception pointer in the current thread.  Upon returning to managed
from native code, the exception will be noted and handled appropriately.</p>

<p>Native code can "catch" an exception by calling <code>ExceptionCheck</code> or
<code>ExceptionOccurred</code>, and clear it with
<code>ExceptionClear</code>.  As usual,
discarding exceptions without handling them can lead to problems.</p>

<p>There are no built-in functions for manipulating the <code>Throwable</code> object
itself, so if you want to (say) get the exception string you will need to
find the <code>Throwable</code> class, look up the method ID for
<code>getMessage "()Ljava/lang/String;"</code>, invoke it, and if the result
is non-NULL use <code>GetStringUTFChars</code> to get something you can
hand to <code>printf(3)</code> or equivalent.</p>


<a name="extended_checking" id="extended_checking"></a>
<h2>Extended Checking</h2>

<p>JNI does very little error checking. Errors usually result in a crash. Android also offers a mode called CheckJNI, where the JavaVM and JNIEnv function table pointers are switched to tables of functions that perform an extended series of checks before calling the standard implementation.</p>

<p>The additional checks include:</p>

<ul>
<li>Arrays: attempting to allocate a negative-sized array.</li>
<li>Bad pointers: passing a bad jarray/jclass/jobject/jstring to a JNI call, or passing a NULL pointer to a JNI call with a non-nullable argument.</li>
<li>Class names: passing anything but the “java/lang/String” style of class name to a JNI call.</li>
<li>Critical calls: making a JNI call between a “critical” get and its corresponding release.</li>
<li>Direct ByteBuffers: passing bad arguments to <code>NewDirectByteBuffer</code>.</li>
<li>Exceptions: making a JNI call while there’s an exception pending.</li>
<li>JNIEnv*s: using a JNIEnv* from the wrong thread.</li>
<li>jfieldIDs: using a NULL jfieldID, or using a jfieldID to set a field to a value of the wrong type (trying to assign a StringBuilder to a String field, say), or using a jfieldID for a static field to set an instance field or vice versa, or using a jfieldID from one class with instances of another class.</li>
<li>jmethodIDs: using the wrong kind of jmethodID when making a <code>Call*Method</code> JNI call: incorrect return type, static/non-static mismatch, wrong type for ‘this’ (for non-static calls) or wrong class (for static calls).</li>
<li>References: using <code>DeleteGlobalRef</code>/<code>DeleteLocalRef</code> on the wrong kind of reference.</li>
<li>Release modes: passing a bad release mode to a release call (something other than <code>0</code>, <code>JNI_ABORT</code>, or <code>JNI_COMMIT</code>).</li>
<li>Type safety: returning an incompatible type from your native method (returning a StringBuilder from a method declared to return a String, say).</li>
<li>UTF-8: passing an invalid <a href="http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8">Modified UTF-8</a> byte sequence to a JNI call.</li>
</ul>

<p>(Accessibility of methods and fields is still not checked: access restrictions don't apply to native code.)</p>

<p>There are several ways to enable CheckJNI.</p>

<p>If you’re using the emulator, CheckJNI is on by default.</p>

<p>If you have a rooted device, you can use the following sequence of commands to restart the runtime with CheckJNI enabled:</p>

<pre>adb shell stop
adb shell setprop dalvik.vm.checkjni true
adb shell start</pre>

<p>In either of these cases, you’ll see something like this in your logcat output when the runtime starts:</p>

<pre>D AndroidRuntime: CheckJNI is ON</pre>

<p>If you have a regular device, you can use the following command:</p>

<pre>adb shell setprop debug.checkjni 1</pre>

<p>This won’t affect already-running apps, but any app launched from that point on will have CheckJNI enabled. (Change the property to any other value or simply rebooting will disable CheckJNI again.) In this case, you’ll see something like this in your logcat output the next time an app starts:</p>

<pre>D Late-enabling CheckJNI</pre>

<p>You can also set the <code>android:debuggable</code> attribute in your application's manifest to
turn on CheckJNI just for your app. Note that the Android build tools will do this automatically for
certain build types.


<a name="native_libraries" id="native_libraries"></a>
<h2>Native Libraries</h2>

<p>You can load native code from shared libraries with the standard
<code>System.loadLibrary</code> call.  The
preferred way to get at your native code is:</p>

<ul>
<li> Call <code>System.loadLibrary</code> from a static class
initializer.  (See the earlier example, where one is used to call
<code>nativeClassInit</code>.)  The argument is the "undecorated"
library name, so to load "libfubar.so" you would pass in "fubar".</li>
<li> Provide a native function: <code><strong>jint JNI_OnLoad(JavaVM* vm, void* reserved)</strong></code></li>
<li>In <code>JNI_OnLoad</code>, register all of your native methods.  You
should declare
the methods "static" so the names don't take up space in the symbol table
on the device.</li>
</ul>

<p>The <code>JNI_OnLoad</code> function should look something like this if
written in C++:</p>
<pre>jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv* env;
    if (vm-&gt;GetEnv(reinterpret_cast&lt;void**&gt;(&env), JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    // Get jclass with env-&gt;FindClass.
    // Register methods with env-&gt;RegisterNatives.

    return JNI_VERSION_1_6;
}</pre>

<p>You can also call <code>System.load</code> with the full path name of the
shared library.  For Android apps, you may find it useful to get the full
path to the application's private data storage area from the context object.</p>

<p>This is the recommended approach, but not the only approach.  Explicit
registration is not required, nor is it necessary that you provide a
<code>JNI_OnLoad</code> function.
You can instead use "discovery" of native methods that are named in a
specific way (see <a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615">the JNI spec</a> for details), though this is less desirable because if a method signature is wrong you won't know
about it until the first time the method is actually used.</p>

<p>One other note about <code>JNI_OnLoad</code>: any <code>FindClass</code>
calls you make from there will happen in the context of the class loader
that was used to load the shared library.  Normally <code>FindClass</code>
uses the loader associated with the method at the top of the interpreted
stack, or if there isn't one (because the thread was just attached) it uses
the "system" class loader.  This makes
<code>JNI_OnLoad</code> a convenient place to look up and cache class
object references.</p>


<a name="64_bit" id="64_bit"></a>
<h2>64-bit Considerations</h2>

<p>Android is currently expected to run on 32-bit platforms.  In theory it
could be built for a 64-bit system, but that is not a goal at this time.
For the most part this isn't something that you will need to worry about
when interacting with native code,
but it becomes significant if you plan to store pointers to native
structures in integer fields in an object.  To support architectures
that use 64-bit pointers, <strong>you need to stash your native pointers in a
<code>long</code> field rather than an <code>int</code></strong>.


<a name="unsupported" id="unsupported"></a>
<h2>Unsupported Features/Backwards Compatibility</h2>

<p>All JNI 1.6 features are supported, with the following exception:</p>
<ul>
    <li><code>DefineClass</code> is not implemented.  Android does not use
    Java bytecodes or class files, so passing in binary class data
    doesn't work.</li>
</ul>

<p>For backward compatibility with older Android releases, you may need to
be aware of:</p>
<ul>
    <li><b>Dynamic lookup of native functions</b>
    <p>Until Android 2.0 (Eclair), the '$' character was not properly
    converted to "_00024" during searches for method names.  Working
    around this requires using explicit registration or moving the
    native methods out of inner classes.
    <li><b>Detaching threads</b>
    <p>Until Android 2.0 (Eclair), it was not possible to use a <code>pthread_key_create</code>
    destructor function to avoid the "thread must be detached before
    exit" check.  (The runtime also uses a pthread key destructor function,
    so it'd be a race to see which gets called first.)
    <li><b>Weak global references</b>
    <p>Until Android 2.2 (Froyo), weak global references were not implemented.
    Older versions will vigorously reject attempts to use them.  You can use
    the Android platform version constants to test for support.
    <p>Until Android 4.0 (Ice Cream Sandwich), weak global references could only
    be passed to <code>NewLocalRef</code>, <code>NewGlobalRef</code>, and
    <code>DeleteWeakGlobalRef</code>. (The spec strongly encourages
    programmers to create hard references to weak globals before doing
    anything with them, so this should not be at all limiting.)
    <p>From Android 4.0 (Ice Cream Sandwich) on, weak global references can be
    used like any other JNI references.</li>
    <li><b>Local references</b>
    <p>Until Android 4.0 (Ice Cream Sandwich), local references were
    actually direct pointers. Ice Cream Sandwich added the indirection
    necessary to support better garbage collectors, but this means that lots
    of JNI bugs are undetectable on older releases. See
    <a href="http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html">JNI Local Reference Changes in ICS</a> for more details.
    <li><b>Determining reference type with <code>GetObjectRefType</code></b>
    <p>Until Android 4.0 (Ice Cream Sandwich), as a consequence of the use of
    direct pointers (see above), it was impossible to implement
    <code>GetObjectRefType</code> correctly. Instead we used a heuristic
    that looked through the weak globals table, the arguments, the locals
    table, and the globals table in that order. The first time it found your
    direct pointer, it would report that your reference was of the type it
    happened to be examining. This meant, for example, that if 
    you called <code>GetObjectRefType</code> on a global jclass that happened
    to be the same as the jclass passed as an implicit argument to your static 
    native method, you'd get <code>JNILocalRefType</code> rather than
    <code>JNIGlobalRefType</code>.
</ul>


<a name="faq_ULE" id="faq_ULE"></a>
<h2>FAQ: Why do I get <code>UnsatisfiedLinkError</code>?</h2>

<p>When working on native code it's not uncommon to see a failure like this:</p>
<pre>java.lang.UnsatisfiedLinkError: Library foo not found</pre>

<p>In some cases it means what it says &mdash; the library wasn't found.  In
other cases the library exists but couldn't be opened by <code>dlopen(3)</code>, and
the details of the failure can be found in the exception's detail message.</p>

<p>Common reasons why you might encounter "library not found" exceptions:</p>
<ul>
    <li>The library doesn't exist or isn't accessible to the app.  Use
    <code>adb shell ls -l &lt;path&gt;</code> to check its presence
    and permissions.
    <li>The library wasn't built with the NDK.  This can result in
    dependencies on functions or libraries that don't exist on the device.
</ul>

<p>Another class of <code>UnsatisfiedLinkError</code> failures looks like:</p>
<pre>java.lang.UnsatisfiedLinkError: myfunc
        at Foo.myfunc(Native Method)
        at Foo.main(Foo.java:10)</pre>

<p>In logcat, you'll see:</p>
<pre>W/dalvikvm(  880): No implementation found for native LFoo;.myfunc ()V</pre>

<p>This means that the runtime tried to find a matching method but was
unsuccessful.  Some common reasons for this are:</p>
<ul>
    <li>The library isn't getting loaded.  Check the logcat output for
    messages about library loading.
    <li>The method isn't being found due to a name or signature mismatch.  This
    is commonly caused by:
    <ul>
        <li>For lazy method lookup, failing to declare C++ functions
        with <code>extern "C"</code> and appropriate
        visibility (<code>JNIEXPORT</code>). Note that prior to Ice Cream
        Sandwich, the JNIEXPORT macro was incorrect, so using a new GCC with
        an old <code>jni.h</code> won't work.
        You can use <code>arm-eabi-nm</code>
        to see the symbols as they appear in the library; if they look
        mangled (something like <code>_Z15Java_Foo_myfuncP7_JNIEnvP7_jclass</code>
        rather than <code>Java_Foo_myfunc</code>), or if the symbol type is
        a lowercase 't' rather than an uppercase 'T', then you need to
        adjust the declaration.
        <li>For explicit registration, minor errors when entering the
        method signature.  Make sure that what you're passing to the
        registration call matches the signature in the log file.
        Remember that 'B' is <code>byte</code> and 'Z' is <code>boolean</code>.
        Class name components in signatures start with 'L', end with ';',
        use '/' to separate package/class names, and use '$' to separate
        inner-class names (<code>Ljava/util/Map$Entry;</code>, say).
    </ul>
</ul>

<p>Using <code>javah</code> to automatically generate JNI headers may help
avoid some problems.


<a name="faq_FindClass" id="faq_FindClass"></a>
<h2>FAQ: Why didn't <code>FindClass</code> find my class?</h2>

<p>(Most of this advice applies equally well to failures to find methods
with <code>GetMethodID</code> or <code>GetStaticMethodID</code>, or fields
with <code>GetFieldID</code> or <code>GetStaticFieldID</code>.)</p>

<p>Make sure that the class name string has the correct format.  JNI class
names start with the package name and are separated with slashes,
such as <code>java/lang/String</code>.  If you're looking up an array class,
you need to start with the appropriate number of square brackets and
must also wrap the class with 'L' and ';', so a one-dimensional array of
<code>String</code> would be <code>[Ljava/lang/String;</code>.
If you're looking up an inner class, use '$' rather than '.'. In general,
using <code>javap</code> on the .class file is a good way to find out the
internal name of your class.</p>

<p>If you're using ProGuard, make sure that
<a href="{@docRoot}tools/help/proguard.html#configuring">ProGuard didn't
strip out your class</a>. This can happen if your class/method/field is only
used from JNI.

<p>If the class name looks right, you could be running into a class loader
issue.  <code>FindClass</code> wants to start the class search in the
class loader associated with your code.  It examines the call stack,
which will look something like:
<pre>    Foo.myfunc(Native Method)
    Foo.main(Foo.java:10)</pre>

<p>The topmost method is <code>Foo.myfunc</code>.  <code>FindClass</code>
finds the <code>ClassLoader</code> object associated with the <code>Foo</code>
class and uses that.</p>

<p>This usually does what you want.  You can get into trouble if you
create a thread yourself (perhaps by calling <code>pthread_create</code>
and then attaching it with <code>AttachCurrentThread</code>). Now there
are no stack frames from your application.
If you call <code>FindClass</code> from this thread, the
JavaVM will start in the "system" class loader instead of the one associated
with your application, so attempts to find app-specific classes will fail.</p>

<p>There are a few ways to work around this:</p>
<ul>
    <li>Do your <code>FindClass</code> lookups once, in
    <code>JNI_OnLoad</code>, and cache the class references for later
    use.  Any <code>FindClass</code> calls made as part of executing
    <code>JNI_OnLoad</code> will use the class loader associated with
    the function that called <code>System.loadLibrary</code> (this is a
    special rule, provided to make library initialization more convenient).
    If your app code is loading the library, <code>FindClass</code>
    will use the correct class loader.
    <li>Pass an instance of the class into the functions that need
    it, by declaring your native method to take a Class argument and
    then passing <code>Foo.class</code> in.
    <li>Cache a reference to the <code>ClassLoader</code> object somewhere
    handy, and issue <code>loadClass</code> calls directly.  This requires
    some effort.
</ul>


<a name="faq_sharing" id="faq_sharing"></a>
<h2>FAQ: How do I share raw data with native code?</h2>

<p>You may find yourself in a situation where you need to access a large
buffer of raw data from both managed and native code.  Common examples
include manipulation of bitmaps or sound samples.  There are two
basic approaches.</p>

<p>You can store the data in a <code>byte[]</code>.  This allows very fast
access from managed code.  On the native side, however, you're
not guaranteed to be able to access the data without having to copy it.  In
some implementations, <code>GetByteArrayElements</code> and
<code>GetPrimitiveArrayCritical</code> will return actual pointers to the
raw data in the managed heap, but in others it will allocate a buffer
on the native heap and copy the data over.</p>

<p>The alternative is to store the data in a direct byte buffer.  These
can be created with <code>java.nio.ByteBuffer.allocateDirect</code>, or
the JNI <code>NewDirectByteBuffer</code> function.  Unlike regular
byte buffers, the storage is not allocated on the managed heap, and can
always be accessed directly from native code (get the address
with <code>GetDirectBufferAddress</code>).  Depending on how direct
byte buffer access is implemented, accessing the data from managed code
can be very slow.</p>

<p>The choice of which to use depends on two factors:</p>
<ol>
    <li>Will most of the data accesses happen from code written in Java
    or in C/C++?
    <li>If the data is eventually being passed to a system API, what form
    must it be in?  (For example, if the data is eventually passed to a
    function that takes a byte[], doing processing in a direct
    <code>ByteBuffer</code> might be unwise.)
</ol>

<p>If there's no clear winner, use a direct byte buffer.  Support for them
is built directly into JNI, and performance should improve in future releases.</p>
