简体   繁体   中英

Android NDK sample crashes: UnsatisfiedLinkError

I am quite new to ndk and I am trying to run sample given on maracana tutorial for startup.

here is my class that defines the methods.

package com.example.fibonacciactivity;
public class FibLib {

// load library .so when load this class
static {
    System.loadLibrary("com_example_fibonacciactivity_FibLib");
    System.out.println("load library");
}

public native static long fibNR(long n);

public native static long fibNi(long n);
// done lib
}

and my com_example_fibonacciactivity_FibLib.h file is as follows:

#include <jni.h>
#ifndef _Included_com_example_fibonacciactivity_FibLib
#define _Included_com_example_fibonacciactivity_FibLib
#ifdef __cplusplus

extern "C" {
#endif
/*
* Class:     com_example_fibonacciactivity_FibLib
* Method:    fibNR
* Signature: (J)J
*/



JNIEXPORT jlong JNICALL Java_com_example_fibonacciactivity_FibLib_fibNR
(JNIEnv *, jclass, jlong);
/*
* Class:     com_example_fibonacciactivity_FibLib
* Method:    fibNi
* Signature: (J)J
*/



JNIEXPORT jlong JNICALL Java_com_example_fibonacciactivity_FibLib_fibNi
(JNIEnv *, jclass, jlong);
#ifdef __cplusplus
}
#endif
#endif

and my com_example_fibonacciactivity_FibLib.c file code is like this:

#include "com_example_fibonacciactivity_FibLib.h"

JNIEXPORT jlong JNICALL Java_com_example_fibonacciactivity_FibLib_fibNR(
        JNIEnv *env, jclass jclazz, jlong n) {
    return fib(n);
}


JNIEXPORT jlong JNICALL Java_com_example_fibonacciactivity_FibLib_fibNi(
        JNIEnv *env, jclass jclazz, jlong n) {

jlong previous = -1;
jlong result = 1;
jlong i;
for (i = 0; i <= s; i++) {
    jlong sum = result + previous;
    previous = result;
    result = sum;
}
return result;
}

static jlong fib(jlong n) {
    return n <= 0 ? 0 : n == 1 ? 1 : fib(n - 1) + fib(n - 2);
}

I really cant figure out what is the issue? Can anybody help? I am Using Fedora linux on centos 6.

also the error I get is:

D/dalvikvm( 6054): Trying to load lib /data/app-lib/com.example.fibonacciactivity-2/libcom_example_fibonacciactivity_FibLib.so 0x42704a08
D/dalvikvm( 6054): Added shared lib /data/app-lib/com.example.fibonacciactivity-2/libcom_example_fibonacciactivity_FibLib.so 0x42704a08
D/dalvikvm( 6054): No JNI_OnLoad found in /data/app-lib/com.example.fibonacciactivity-2/libcom_example_fibonacciactivity_FibLib.so 0x42704a08, skipping init
I/System.out( 6054): load library
W/dalvikvm( 6054): No implementation found for native Lcom/example/fibonacciactivity/FibLib;.fibNR:(J)J
W/dalvikvm( 6054): threadid=11: thread exiting with uncaught exception (group=0x41f8eba8)
E/AndroidRuntime( 6054): FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime( 6054): Process: com.example.fibonacciactivity, PID: 6054
E/AndroidRuntime( 6054): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime( 6054):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
E/AndroidRuntime( 6054):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
E/AndroidRuntime( 6054):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
E/AndroidRuntime( 6054):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
E/AndroidRuntime( 6054):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
E/AndroidRuntime( 6054):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E/AndroidRuntime( 6054):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
E/AndroidRuntime( 6054):    at java.lang.Thread.run(Thread.java:841)
E/AndroidRuntime( 6054): Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.example.fibonacciactivity.FibLib.fibNR:(J)J
E/AndroidRuntime( 6054):    at com.example.fibonacciactivity.FibLib.fibNR(Native Method)
E/AndroidRuntime( 6054):    at com.example.fibonacciactivity.MainActivity$1.doInBackground(MainActivity.java:56)
E/AndroidRuntime( 6054):    at com.example.fibonacciactivity.MainActivity$1.doInBackground(MainActivity.java:1)
E/AndroidRuntime( 6054):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
E/AndroidRuntime( 6054):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
E/AndroidRuntime( 6054):    ... 4 more
W/ActivityManager(  511):   Force finishing activity com.example.fibonacciactivity/.MainActivity

My Android.mk is:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILE := com_example_fibonacciactivity_FibLib.c
LOCAL_MODULE := com_example_fibonacciactivity_FibLib
include $(BUILD_SHARED_LIBRARY)

The problem is in your Android.mk file. The name of the variable is LOCAL_SRC_FILES , in plural. So just fix the third line there to:

LOCAL_SRC_FILES := com_example_fibonacciactivity_FibLib.c

And you should be fine (minus some simple compilation errors).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM