仿真器上的Android NDK崩溃
我对Android非常陌生,尤其是NDK。我试着像hello jni一样加载示例,它工作得非常好。然而,当我尝试编写自己的代码时,当我使用ndk build命令构建它时,它没有任何问题。但当我试图从java代码中调用该类并对其进行编译时,它在emulator上崩溃了。我不知道问题出在哪里,因为我所做的是复制hello jni示例中的代码,并用我的代码替换一些代码,但它不起作用。求你了,我真的需要你的帮助 我的Android.mk仿真器上的Android NDK崩溃,android,android-ndk,Android,Android Ndk,我对Android非常陌生,尤其是NDK。我试着像hello jni一样加载示例,它工作得非常好。然而,当我尝试编写自己的代码时,当我使用ndk build命令构建它时,它没有任何问题。但当我试图从java代码中调用该类并对其进行编译时,它在emulator上崩溃了。我不知道问题出在哪里,因为我所做的是复制hello jni示例中的代码,并用我的代码替换一些代码,但它不起作用。求你了,我真的需要你的帮助 我的Android.mk LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AndroidProject
LOCAL_SRC_FILES := AndroidProject.c
include $(BUILD_SHARED_LIBRARY)
我的AndroidProject.c
#include <string.h>
#include <jni.h>
#include <stdio.h>
int s_ButtonPressCounter = 0;
jstring
Java_com_example_AndroidProject_AndroidProject_invokeNativeFunction()( JNIEnv* env,
jobject thiz )
{
char szBuf[512];
sprintf(szBuf, " You have pressed this huge button %d times", s_ButtonPressCounter++);
jstring str = (*env)->NewStringUTF(env, szBuf);
return str;
}
日志:
以下是日志:
09-24 22:19:00.369: E/Trace(823): error opening trace file: No such file or directory (2)
09-24 22:19:00.819: D/dalvikvm(823): Trying to load lib /data/app- lib/com.example.androidproject-2/libndktest.so 0x40cdf458
09-24 22:19:00.839: D/dalvikvm(823): Added shared lib /data/app-lib/com.example.androidproject-2/libndktest.so 0x40cdf458
09-24 22:19:00.839: D/dalvikvm(823): No JNI_OnLoad found in /data/app-lib/com.example.androidproject-2/libndktest.so 0x40cdf458, skipping init
09-24 22:19:01.529: W/dalvikvm(823): No implementation found for native Lcom/example/androidproject/AndroidProject;.invokeNativeFunction:()Ljava/lang/String;
09-24 22:19:01.529: D/AndroidRuntime(823): Shutting down VM
09-24 22:19:01.539: W/dalvikvm(823): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
09-24 22:19:01.559: E/AndroidRuntime(823): FATAL EXCEPTION: main
09-24 22:19:01.559: E/AndroidRuntime(823): java.lang.UnsatisfiedLinkError: Native method not found: com.example.androidproject.AndroidProject.invokeNativeFunction:()Ljava/lang/String;
09-24 22:19:01.559: E/AndroidRuntime(823): at com.example.androidproject.AndroidProject.invokeNativeFunction(Native Method)
09-24 22:19:01.559: E/AndroidRuntime(823): at com.example.androidproject.AndroidProject.onCreate(AndroidProject.java:27)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.app.Activity.performCreate(Activity.java:5104)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.app.ActivityThread.access$600(ActivityThread.java:141)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.os.Handler.dispatchMessage(Handler.java:99)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.os.Looper.loop(Looper.java:137)
09-24 22:19:01.559: E/AndroidRuntime(823): at android.app.ActivityThread.main(ActivityThread.java:5041)
09-24 22:19:01.559: E/AndroidRuntime(823): at java.lang.reflect.Method.invokeNative(Native Method)
09-24 22:19:01.559: E/AndroidRuntime(823): at java.lang.reflect.Method.invoke(Method.java:511)
09-24 22:19:01.559: E/AndroidRuntime(823): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-24 22:19:01.559: E/AndroidRuntime(823): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-24 22:19:01.559: E/AndroidRuntime(823): at dalvik.system.NativeStart.main(Native Method)
基于您的logcat中的这一点:
09-24 22:19:01.559: E/AndroidRuntime(823): java.lang.UnsatisfiedLinkError: Native method not found:
com.example.androidproject.AndroidProject.invokeNativeFunction:()Ljava/lang/String;
首先,看起来invokeNativeFunction是来自上一个项目的复制粘贴/错误。由于您没有使用它,请删除它的声明
其次,看起来需要在编译的Java代码上运行javah,以生成具有正确函数名的头。为此:
执行buildall,让Java生成类文件
打开终端
更改到您的bin目录
在AndroidProject上运行javah:
javah -o ../jni/AndroidProject.h classes/com/example/AndroidProject/AndroidProject
将AndroidProject.h包含在AndroidProject.c中
#include <string.h>
#include <jni.h>
#include <stdio.h>
int s_ButtonPressCounter = 0;
jstring
Java_com_example_AndroidProject_AndroidProject_invokeNativeFunction()( JNIEnv* env,
jobject thiz )
{
char szBuf[512];
sprintf(szBuf, " You have pressed this huge button %d times", s_ButtonPressCounter++);
jstring str = (*env)->NewStringUTF(env, szBuf);
return str;
}
执行“全部生成”以确保新的共享对象已生成并打包
Java需要C函数名
Java_com_example_androidproject_AndroidProject_invokeNativeFunction
所以这看起来像是一个简单的命名问题。我们可以看看你的日志吗?日志已经发布了。我真的不知道该怎么办。@jww-很抱歉。我是新来的,关于InvokenativeFunction,我搞错了。我将java和C代码中的stringfromJNI替换为invokeNativeFunction并再次构建它。和以前一样,它运行得很好,但在emulator上运行后出现了相同的错误。我不知道如何执行您所说的第二个操作。你能告诉我更多的细节怎么做吗?很抱歉给您带来不便,我刚刚接触过这些东西。@John Anothony-您正在运行Windows吗?是的,我正在使用Windows。