我的本地库代码:
#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;
}
}
库已经成功编译,libpacman.so 在 libs/armeabi 目录下,但是 logcat 显示:
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
系统找不到库,但如果解压APK文件,则该库位于lib目录中。为什么不在libs目录下?
编辑。 好的,现在我修复了包名:
jstring Java_com_wiagames_pacman_MainActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
return env->NewStringUTF("Hello from native code!");
}
Android.mk 和 MainActivity.java 是一样的。包名在所有地方都是 com.wiagames.pacman。但我遇到了错误:
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
javah -jni your.package.name.YourClassName
。也许您发布的函数签名无效。 - Hossein Mobasher