Android NDK failed to load library

My native library code:

#include <string.h> #include <jni.h> jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { return env->NewStringUTF("Hello from native code!"); } 

Android.mk:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libpacman LOCAL_SRC_FILES := main.cpp LOCAL_CFLAGS := -DANDROID_NDK LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY) 

MainActivity.java:

 public class MainActivity extends Activity { static { System.loadLibrary("libpacman"); } // declare the native code function - must match main.cpp private native String invokeNativeFunction(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // this is where we call the native code String hello = invokeNativeFunction(); new AlertDialog.Builder(this).setMessage(hello).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 

The library compiled successfully, and libpacman.so is in the libs / armeabi directory, but logcat says:

 E/AndroidRuntime(13060): FATAL EXCEPTION: main E/AndroidRuntime(13060): java.lang.ExceptionInInitializerError E/AndroidRuntime(13060): at java.lang.Class.newInstanceImpl(Native Method) E/AndroidRuntime(13060): at java.lang.Class.newInstance(Class.java:1319) E/AndroidRuntime(13060): at android.app.Instrumentation.newActivity(Instrumentation.java:1053) E/AndroidRuntime(13060): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) E/AndroidRuntime(13060): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) E/AndroidRuntime(13060): at android.app.ActivityThread.access$600(ActivityThread.java:130) E/AndroidRuntime(13060): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) E/AndroidRuntime(13060): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(13060): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(13060): at android.app.ActivityThread.main(ActivityThread.java:4745) E/AndroidRuntime(13060): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(13060): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(13060): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime(13060): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime(13060): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(13060): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libpacman: findLibrary returned null E/AndroidRuntime(13060): at java.lang.Runtime.loadLibrary(Runtime.java:365) E/AndroidRuntime(13060): at java.lang.System.loadLibrary(System.java:535) E/AndroidRuntime(13060): at com.example.pacman.MainActivity.<clinit>(MainActivity.java:11) E/AndroidRuntime(13060): ... 15 more W/ActivityManager( 315): Force finishing activity com.example.pacman/.MainActivity 

So, the system cannot find the library, but if the unzip APK file is in the lib directory. Why not in libraries?

Change OK, now I fixed the package names:

 jstring Java_com_wiagames_pacman_MainActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { return env->NewStringUTF("Hello from native code!"); } 

Android.mk and MainActivity.java are the same. The com.wiagames.pacman package is everywhere. But I get an error message:

 E/AndroidRuntime(23084): FATAL EXCEPTION: main E/AndroidRuntime(23084): java.lang.ExceptionInInitializerError E/AndroidRuntime(23084): at java.lang.Class.newInstanceImpl(Native Method) E/AndroidRuntime(23084): at java.lang.Class.newInstance(Class.java:1319) E/AndroidRuntime(23084): at android.app.Instrumentation.newActivity(Instrumentation.java:1053) E/AndroidRuntime(23084): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) E/AndroidRuntime(23084): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) E/AndroidRuntime(23084): at android.app.ActivityThread.access$600(ActivityThread.java:130) E/AndroidRuntime(23084): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) E/AndroidRuntime(23084): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(23084): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(23084): at android.app.ActivityThread.main(ActivityThread.java:4745) E/AndroidRuntime(23084): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(23084): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(23084): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime(23084): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime(23084): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(23084): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libpacman: findLibrary returned null E/AndroidRuntime(23084): at java.lang.Runtime.loadLibrary(Runtime.java:365) E/AndroidRuntime(23084): at java.lang.System.loadLibrary(System.java:535) E/AndroidRuntime(23084): at com.wiagames.pacman.MainActivity.<clinit>(MainActivity.java:13) E/AndroidRuntime(23084): ... 15 more W/ActivityManager( 315): Force finishing activity com.wiagames.pacman/.MainActivity 
+3
source share
3 answers

According to my experience in the NDK, your class path in an Android app should be the same as

 Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction Java_com_mindtherobot_samples_ndkfoo [package name] NdkFooActivity [activity or class name] invokeNativeFunction [function name] 
+2
source

Your class name is clearly not NdkFooActivity . Also make sure your java package is com.mindtherobot.samples.ndkfoo . The name of the built-in function and the Java context from which you call it must be synchronized. Usually you create your own header with javah -jni , which works with an already compiled class, and not with java sources.

+4
source

The name of the library that you pass to System.loadLibrary() should be just pacman , not libpacman .

+4
source

All Articles