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 OpenGL ES: auto-corrección env-> self y NvRmChannelSubmit fallaron
- Cómo conectar una biblioteca C a la aplicación de iOS
- Definir macro para registrar error con archivo y línea en android
- Android Equalizer para nivel de API <9
- CLI en DalvikVM falla en JNI lib
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 utilizar Java con NDK Android?
- Android: Xamarin JNI Binding - Herencia de clase abstracta
- Libusb_open_device_with_vid_pid falló al intentar acceder al dispositivo USB
- ¿Qué es JNI Graphics o cómo usarlo?
- UnityPlayerActivity no recibe registro onCreate ()
- Desbordamiento de tabla de referencia Jni
- Codificación de vídeo en Android mediante cv :: Mat y MediaCodec
- Creación de un archivo de encabezado para la clase de actividad de Android
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