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:
- Android ICS 4.0 NDK NewStringUTF se está estrellando la aplicación
- ¿Podemos acceder al controlador de micrófono de mi teléfono Android
- Jni llama al método java que toma una interfaz java personalizada como parámetro
- Cómo llamar a función Java desde c
- Filtrado de MatOfDMatch
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
- Cómo agregar un servicio de sistema a Android Framework
- JNI: Pasar varios parámetros en la firma de función para GetMethodID
- No se invoca el método Java cuando se llama desde pthread nativo
- SQLite con Android NDK
- Gradle de Android, libs nativas para diferentes arquitecturas
- El proceso de alojamiento del servicio de cámara ha muerto inesperadamente
- ¿Cómo puedo llamar al código C / C ++ de Android usando JNA?
- Cómo obtener un algoritmo de Hashing de archivo rápido para archivos grandes en un dispositivo móvil
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
.
- Visible e invisible con una casilla de verificación
- Conexión a un dispositivo HID bluetooth (ratón) mediante L2CAP