2012-07-20 84 views
0

我是Android NDK的新手,所以我希望我的问题不是愚蠢的。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!"); 
} 
+0

您的c函数名称与您的java类的完全限定名称不匹配,请检查我的答案。 – Nermeen 2012-07-20 07:56:56

+0

working thanks :) – progdoc 2012-07-20 08:07:32

回答

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知道它必须重新编译。