Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NDK-示例问题(未满足链接错误)_Android_Android Ndk - Fatal编程技术网

Android NDK-示例问题(未满足链接错误)

Android NDK-示例问题(未满足链接错误),android,android-ndk,Android,Android Ndk,我试图运行并理解这个示例: 这是一个非常简单的示例,包含以下文件: FibActivity.java - main activity file FibLib - class implementing and calling the native functions fib.c - the C source file with the native functions and code FibLib.h - the C header file, automatically created from

我试图运行并理解这个示例:

这是一个非常简单的示例,包含以下文件:

FibActivity.java - main activity file
FibLib - class implementing and calling the native functions
fib.c - the C source file with the native functions and code
FibLib.h - the C header file, automatically created from the FibLib class
Android.mk - the makefile
我已经完全按照描述实现了这个示例。但是,当我运行它时,当应用程序尝试访问本机代码时,会出现以下错误(UnsatisfiedLinkError):

12-21 11:31:53.042: D/dalvikvm(1491): Trying to load lib /data/data
/com.frank.android.ndk/lib/libfib.so 0x405143b8
12-21 11:31:53.042: D/dalvikvm(1491): Added shared lib /data/data/com.frank.android.ndk
/lib/libfib.so 0x405143b8
12-21 11:31:53.042: D/dalvikvm(1491): No JNI_OnLoad found in /data/data
/com.frank.android.ndk/lib/libfib.so 0x405143b8, skipping init
12-21 11:31:53.093: W/dalvikvm(1491): No implementation found for native Lcom/frank
/android/ndk/FibLib;.fibN (I)J
12-21 11:31:53.102: D/AndroidRuntime(1491): Shutting down VM
12-21 11:31:53.102: W/dalvikvm(1491): threadid=1: thread exiting with uncaught 
exception (group=0x40015560)
12-21 11:31:53.112: E/AndroidRuntime(1491): FATAL EXCEPTION: main
12-21 11:31:53.112: E/AndroidRuntime(1491): java.lang.UnsatisfiedLinkError: fibN
12-21 11:31:53.112: E/AndroidRuntime(1491): at 
com.frank.android.ndk.FibLib.fibN(Native Method)
12-21 11:31:53.112: E/AndroidRuntime(1491): at 
com.frank.android.ndk.JavaNativeFibonacciAct
ivity.onClick(JavaNativeFibonacciActivity.java:52)
我注意到的唯一奇怪的事情是,根据logcat,eclipse试图从/lib文件夹加载库,而自动创建的文件夹称为/libs。但是,将/lib文件夹重命名为/libs并重建所有内容并没有什么区别

有人有什么想法吗?几天来,我一直在尝试使用一些示例,包括使用javah创建头文件。仅创建主活动和c文件,然后从主活动调用本机代码似乎是可行的,但一旦开始使用头文件,就会出现未满足的链接错误

更新:

从FibLib.java:

// Native implementation
static {
    System.loadLibrary("fib"); // 
}

// Native implementation - recursive
public static native long fibN (int n);

// Native implementation - iterative
public static native long fibNI (int n);
fib.c文件:

#include "com_frank_android_ndk_FibLib.h" /*  */

/* Recursive Fibonacci Algorithm  */
long fibN(long n) {
    if(n<=0) return 0;
    if(n==1) return 1;
    return fibN(n-1) + fibN(n-2);
}

/* Iterative Fibonacci Algorithm  */
long fibNI(long n) {
    long previous = -1;
    long result = 1;
    long i=0;
    int sum=0;
    for (i = 0; i <= n; i++) {
        sum = result + previous;
        previous = result;
        result = sum;
    }

    return result;
}

/* Signature of the JNI method as generated in header file  */
JNIEXPORT jlong JNICALL Java_com_frank_android__ndk_fibN (JNIEnv *env, jclass obj, jlong  n) {
    return fibN(n);
}

/* Signature of the JNI method as generated in header file  */
JNIEXPORT jlong JNICALL Java_com_frank_android__ndk_fibNI (JNIEnv *env, jclass obj, jlong  n) {
    return fibNI(n);
}

您是否使用ndk build编写了JNi代码? 类名应该与JNI和Java中描述的类名相同

Java_com_qualcomm_QCARSamples_VideoPlayback_VideoPlayback_initApplicationNative
initApplicationNative是Java和JNi上应该相同的方法名
如果不是,那么您将得到这个错误,它只是看起来,还是您的C函数名在单词ndk之前真的使用了双下划线?它应该是单下划线IMHO。

它找不到
Lcom/frank/android/ndk/FibLib;。fibN
。日志表明已成功加载库

该方法应称为
Java\u com\u frank\u android\u ndk\u FibLib\u fibN
;在这个问题中,您有一个双下划线,并且缺少类名。如果有两个不同的方法可以解决同一个问题,那么也可以通过对参数进行编码来区分它们,但这里似乎没有必要这样做

<>你说这是一个C程序,但是有时人们会把C和C++混淆,所以我也会指出,如果这是一个.cpp文件,你需要在声明中放上<代码>外“C”< />代码,否则C++会“函数”函数名。
另请参见

您的Java包名似乎命名为“com.frank.android.ndk”,您的Java类名似乎命名为“FibLib”,而与FibN匹配的C函数名应该是Java\u com\u frank\u android\u ndk\u FibLib\u FibN。Android文档引用了这一点,并详细说明了C函数的JNI命名约定。

您是否使用ndk build编写了JNI代码?是的。没有错误,文件fiblib.so位于/libs/armeabi(自动创建的文件夹)下。您可以发布您的Android.mk文件吗?头文件(fiblib.h)位于哪里?根据您的位置,您需要将位置添加到您的Android.mk,例如,LOCAL_C_INCLUDES:=$(LOCAL_PATH)/includeIt位于/jni文件夹中,我认为这应该可以。我已经编译了fib.C源文件,是的,并且文件libfib.so位于/libs/armeabi(自动创建)文件夹中。参见上面的更新-我已经包括了FibLib.java和fib.cparameters的内容,在JNI中它们的long和在JavaU中使用IntYah,我看到了这一点。然而,这不应该与链接有任何关系?无论如何,我将java代码中的本机实现从int改为long。没有更改。请尝试使用jobject而不是jclassNo,它需要是jclass,因为它是一个静态方法。正如Alex指出的,真正的问题是双下划线。好问题。是的。但我更改了它,并重新编译了文件。还是有同样的错误,谢谢,伙计。一个简单的类型错误案例,尽管我已经检查了好几次。当然,C函数被命名为fiblib而不是fiblib。
Java_com_qualcomm_QCARSamples_VideoPlayback_VideoPlayback_initApplicationNative