Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android NDK C++ JNI (no implementation found for native...)

There are a couple of things that can lead to "no implementation found". One is getting the function prototype name wrong, another is failing to load the .so at all. Are you sure that System.loadLibrary() is being called before the method is used?

If you don't have a JNI_OnLoad function defined, you may want to create one and have it spit out a log message just to verify that the lib is getting pulled in successfully.

You already dodged the most common problem -- forgetting to use extern "C" -- so it's either the above or some slight misspelling. What does the Java declaration look like?


An additional cause for this error: your undecorated native method name must not contain an underscore!

For example, I wanted to export a C function named AudioCapture_Ping(). Here is my export declaration in C:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object);  //Notice the underscore before Ping

Here was my Java class importing the function:

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapture_Ping();  // FAILS
    ...

I could not get Android to dynamically link to my native method until I removed the underscore:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); 

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapturePing();  // THIS WORKS!
    ...

I had the same problem, but to me the error was in the file Android.mk. I had it:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES := B.cpp 

but should have this:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES += B.cpp 

note the detail += instead :=

I hope that helps.


Called extern "C" as provided in the automatically-generated Studio example, but forgot to wrap the entire rest of the file, including following functions, in {} brackets. Only the first function worked.


An additional reason: Use LOCAL_WHOLE_STATIC_LIBRARIES instead of LOCAL_STATIC_LIBRARIES in android.mk. This stops the library from optimizing out unused API calls because the NDK cannot detect the use of the native bindings from java code.


There is a cpp example under apps in ndk: https://github.com/android/ndk-samples/blob/master/hello-gl2/app/src/main/cpp/gl_code.cpp