Android NDK JNI_OnLoad没有被调用

时间:2015-11-02 22:15:35

标签: android c++ eclipse android-ndk

我正在使用C ++学习NDK开发的教程。该应用程序是一个基本的斐波那契数字打印应用程序。我有适当的System.loadLibrary和JNI_OnLoad调用。我可以在logcat中看到库正在加载。但是,帖子说,系统仍然会根据包名查找方法。继承了logcat的错误。

No implementation found for long com.test.fib.FibLib.fibN(long) (tried Java_com_test_fib_FibLib_fibN and Java_com_test_fib_FibLib_fibN__J)

这是我有cpp代码和相关内容的类。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <android/log.h>
#include <jni.h>

#define LOG_TAG "Fibonacci Stuff"

#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

namespace com_test_fib {

    static long fib(long n) {
        if(n==0) return 0;
        if(n==1) return 1;
        return fib(n-1) + fib(n-2);
    }

    /* JNI wrapper */
    static jlong fibN(JNIEnv* env, jclass clazz, jlong n) {
        return fib(n);
    }

    static JNINativeMethod method_table[] = {
            {"fibN", "(J)J", (void *) fibN }
    };
}

using namespace com_test_fib;
extern "C" jint JNI_Onload(JavaVM* vm, void* reserved) {
    LOG_D ("JNI_OnLoad");
    JNIEnv* env;
    if(vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK           ) {
        LOG_D("Initial Get env error");
        return JNI_ERR;
    }
    else {
        jclass clazz = env->FindClass("com/test/fib/FibLib");
        LOG_D ("Find the class");
        if(clazz) {
            LOG_D ("Class not found");
            jint ret = env->RegisterNatives(clazz, method_table, sizeof(method_table)/sizeof(method_table[0]) );
            env->DeleteLocalRef(clazz);
            return ret ==0 ? JNI_VERSION_1_6 : JNI_ERR;
        } else {
            LOG_D("Some error it seems");
            return JNI_ERR;
        }
    }
}

这是loadLibrary调用

package com.test.fib;

import android.util.Log;

public class FibLib {

    public static long fibJ(long n) {
        if(n==0) {
            return 0;
        }   
        if(n==1) {
            return 1;   
        }
        return fibJ(n-1) + fibJ(n-2);
    }

    /* Wrapper to call the JNI code. This is called by the activity */
    public static native long fibN(long n);

    static {
        Log.d("Sys library loading", "This should call the onLoad function");
        System.loadLibrary("Fib");
    }
}

我可以在Logcat中看到上面的消息。之后,我直接看到异常,并没有来自onLoad方法的消息。我使用的是eclipse,min版本是14,编译版本是5.1.1。设备是nexus 7.包名称与app和命名空间中的com.test.fib匹配。

任何人都可以告诉我这里有什么问题。这让我很生气..

由于

0 个答案:

没有答案