0

我是 Android NDK 的新手,所以我希望我的问题不是一个愚蠢的问题。

我遵循了本教程,在此链接上找到:

http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/

一切都很顺利,我遵循了每一个指示。但是,当我运行应用程序时,它在我的 logcat 中给了我这些错误:

07-20 07:35:25.253: D/dalvikvm(390): Trying to load lib /data/data/com.example.testndk/lib/libndkfoo.so 0x40515310
07-20 07:35:25.253: D/dalvikvm(390): Added shared lib /data/data/com.example.testndk/lib/libndkfoo.so 0x40515310
07-20 07:35:25.253: D/dalvikvm(390): No JNI_OnLoad found in /data/data/com.example.testndk/lib/libndkfoo.so 0x40515310, skipping init
07-20 07:35:25.503: W/dalvikvm(390): No implementation found for native Lcom/example/testndk/NdkFooActivity;.invokeNativeFunction ()Ljava/lang/String;
07-20 07:35:25.513: D/AndroidRuntime(390): Shutting down VM
07-20 07:35:25.513: W/dalvikvm(390): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-20 07:35:25.534: E/AndroidRuntime(390): FATAL EXCEPTION: main
07-20 07:35:25.534: E/AndroidRuntime(390): java.lang.UnsatisfiedLinkError: invokeNativeFunction
07-20 07:35:25.534: E/AndroidRuntime(390):  at com.example.testndk.NdkFooActivity.invokeNativeFunction(Native Method)
07-20 07:35:25.534: E/AndroidRuntime(390):  at com.example.testndk.NdkFooActivity.onCreate(NdkFooActivity.java:23)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.os.Looper.loop(Looper.java:123)
07-20 07:35:25.534: E/AndroidRuntime(390):  at android.app.ActivityThread.main(ActivityThread.java:3683)
07-20 07:35:25.534: E/AndroidRuntime(390):  at java.lang.reflect.Method.invokeNative(Native Method)
07-20 07:35:25.534: E/AndroidRuntime(390):  at java.lang.reflect.Method.invoke(Method.java:507)
07-20 07:35:25.534: E/AndroidRuntime(390):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-20 07:35:25.534: E/AndroidRuntime(390):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-20 07:35:25.534: E/AndroidRuntime(390):  at dalvik.system.NativeStart.main(Native Method)

有没有人有一点线索可能是什么问题?我试图弄清楚,甚至从头开始学习教程,但是问题仍然存在。提前致谢。

我的安卓java代码:

package com.example.testndk;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;

public class NdkFooActivity extends Activity {

      // load the library - name matches jni/Android.mk 
      static {
        System.loadLibrary("ndkfoo");
      }

      // declare the native code function - must match ndkfoo.c
      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();
        }

}

C源代码:

#include <string.h>
#include <jni.h>

jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
  return (*env)->NewStringUTF(env, "Hello from native code!");
}
4

1 回答 1

1

你有java.lang.UnsatisfiedLinkError因为,可能是 c 函数名与你的 java 类的完全限定名不匹配。签入ndkfoo.c以匹配目标 java 类的包和类名:

jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis)

这应该是:

jstring Java_com_example_testndk_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis)

或将您的 java 项目中的包名称更改为:package com.mindtherobot.samples.ndkfoo;

然后您需要在测试之前单击 [Project]->[Clean],以便 eclipse 知道它必须重新编译。

于 2012-07-20T07:44:24.020 回答