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:
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:
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;
}
}
Library is compiled successfully and libpacman.so is in libs/armeabi directory, but logcat says:
成功编译了库和libpacman。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
So, system can not find the library, but if unzip APK file - it's in the lib directory. Why not in the libs?
因此,系统无法找到库,但是如果解压APK文件——它在lib目录中。为什么不在图书馆呢?
Edit. 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. Package is com.wiagames.pacman everywhere. But I'm getting error:
Android。可和MainActivity。java是相同的。包是com.wiagames。吃豆子无处不在。但我得到错误:
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 个解决方案
#1
2
According to my experiences in NDK,the path of your class in Android App must be the same as
根据我在NDK的经验,你的类在Android App上的路径必须和
Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction
Java_com_mindtherobot_samples_ndkfoo [package name]
NdkFooActivity [activity or class name]
invokeNativeFunction [function name]
#2
4
Your classname is visibly not NdkFooActivity
. Also make sure that your java package is com.mindtherobot.samples.ndkfoo
. The name of native function and the Java context from which are you calling it must be in sync. Normally you would produce the native header with javah -jni
which works on the already compiled class, not the java sources.
你的类名显然不是NdkFooActivity。还要确保java包是com.mindtherobo .sampl .ndkfoo。本机函数的名称和调用它的Java上下文必须是同步的。通常,您将使用java -jni生成本机头文件,它在已编译的类上工作,而不是在java源代码上。
#3
4
The library name you pass to System.loadLibrary()
should simply be pacman
, not libpacman
.
传递给System.loadLibrary()的库名应该是pacman,而不是libpacman。
#1
2
According to my experiences in NDK,the path of your class in Android App must be the same as
根据我在NDK的经验,你的类在Android App上的路径必须和
Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction
Java_com_mindtherobot_samples_ndkfoo [package name]
NdkFooActivity [activity or class name]
invokeNativeFunction [function name]
#2
4
Your classname is visibly not NdkFooActivity
. Also make sure that your java package is com.mindtherobot.samples.ndkfoo
. The name of native function and the Java context from which are you calling it must be in sync. Normally you would produce the native header with javah -jni
which works on the already compiled class, not the java sources.
你的类名显然不是NdkFooActivity。还要确保java包是com.mindtherobo .sampl .ndkfoo。本机函数的名称和调用它的Java上下文必须是同步的。通常,您将使用java -jni生成本机头文件,它在已编译的类上工作,而不是在java源代码上。
#3
4
The library name you pass to System.loadLibrary()
should simply be pacman
, not libpacman
.
传递给System.loadLibrary()的库名应该是pacman,而不是libpacman。