No se pudo cargar la aplicación Android NDK

Mi código de biblioteca nativa:

#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; } } 

La biblioteca se compila con éxito y libpacman.so está en el directorio libs / armeabi, pero logcat dice:

 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 

Por lo tanto, el sistema no puede encontrar la biblioteca, pero si unzip archivo APK – que está en el directorio lib. ¿Por qué no en las librerías?

Editar. OK, ahora he arreglado los nombres de los paquetes:

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

Android.mk y MainActivity.java son los mismos. El paquete es com.wiagames.pacman en todas partes. Pero estoy recibiendo error:

 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 

Según mis experiencias en NDK, la ruta de acceso de tu clase en la aplicación para Android debe ser la misma que

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

Tu nombre de clase no es visiblemente NdkFooActivity . También asegúrese de que su paquete java sea com.mindtherobot.samples.ndkfoo . El nombre de la función nativa y el contexto de Java desde el que se está llamando debe estar sincronizado. Normalmente se produciría el encabezado nativo con javah -jni que funciona en la clase ya compilada , no en las fuentes java.

El nombre de biblioteca que pasa a System.loadLibrary() debería ser simplemente pacman , no libpacman .

  • Rellenar los datos en un mapa de bits de Android tan pronto como sea posible desde C
  • Recuperar android.os.Build ... propiedades del sistema mediante la aplicación puramente nativa de Android
  • ¿Cómo utilizar Java con NDK Android?
  • JNI manteniendo una referencia global a un objeto, accediendo a ella con otros métodos JNI. Mantener un objeto C ++ activo en varias llamadas JNI
  • ¿Utilizar un archivo mapeado en memoria como un archivo de intercambio?
  • Desbordamiento de ReferenceTable (máx = 512) JNI
  • Llame a un método java estático de otro paquete de código nativo
  • Temporizador de alta precisión en Android JNI
  • La aplicación de Android NDK no puede acceder a ningún punto de interrupción
  • Android ioctl: permisos y uso de root
  • No se puede asignar suficiente memoria en JNI
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.