仿真器上的Android NDK崩溃

仿真器上的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)

我对Android非常陌生,尤其是NDK。我试着像hello jni一样加载示例,它工作得非常好。然而,当我尝试编写自己的代码时,当我使用ndk build命令构建它时,它没有任何问题。但当我试图从java代码中调用该类并对其进行编译时,它在emulator上崩溃了。我不知道问题出在哪里,因为我所做的是复制hello jni示例中的代码,并用我的代码替换一些代码,但它不起作用。求你了,我真的需要你的帮助

我的Android.mk

    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。