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)

問題が何であるかを少し知っている人はいますか? 私はそれを理解しようとし、チュートリアルを最初から始めましたが、問題は解決しません。前もって感謝します。

私のAndroid 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.UnsatisfiedLinkErrorC関数名が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 に答える