使用Android NDK调用本机代码构建时出现UnsatisfiedLinkError

时间:2013-04-13 09:28:05

标签: android-ndk runtime-error native-code unsatisfiedlinkerror

我在一个简单的Android应用程序中有一个按钮,我用来调用本机函数。 main活动中的按钮调用HADriver.java的函数。该函数依次调用DriverAdapter.cpp中的JNI函数。然后,JNI函数又调用Driver.cpp中的本机函数。以下是在testCout中点击按钮MainActivity时发挥作用的每个文件的部分。

MainActivity中的按钮:

private HADriver driver = new HADriver();
....

testCout.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            driver.testCout();

        }
    });

HADriver.java

package com.ihearhtpi;

public class HADriver {

    static {  
        System.loadLibrary("gnustl_shared");
        System.loadLibrary("driveradapter");  
    } 

    public native void testCout();
}

DriverAdapter.cpp

#include <jni.h>
#include <string.h>
#include <android/log.h>
#include <Driver/driver.h>
#define DEBUG_TAG "NativeCalls"

void Java_com_ihearhtpi_HADriver_testCout(JNIEnv * env, jobject thiz)
{
    Driver* driver = new Driver();
    driver->testCoutFunc();
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", "Testing... this best effing work!");
    delete driver;
}

Driver.cpp

#include <Driver/driver.h>
#include <iostream>
...
//bunch of custom irrelevant functions and includes

Driver::Driver()
{
    CustomFuncs::initBitMasks(); // call global namespace function of CustomFuncs
}

void Driver::testCoutFunc()
{
    std::cout << "These are the droids you're looking for." << std::endl;
}

但是,我一直收到以下错误,每次点击testCout按钮时我的应用都会崩溃。

04-13 02:22:46.130: W/dalvikvm(17228): No implementation found for native Lcom/ihearhtpi/HADriver;.testCout:()V
04-13 02:22:46.130: D/AndroidRuntime(17228): Shutting down VM
04-13 02:22:46.130: W/dalvikvm(17228): threadid=1: thread exiting with uncaught exception (group=0x40e0c300)
04-13 02:22:46.130: E/AndroidRuntime(17228): FATAL EXCEPTION: main
04-13 02:22:46.130: E/AndroidRuntime(17228): java.lang.UnsatisfiedLinkError: Native method not found: com.ihearhtpi.HADriver.testCout:()V
04-13 02:22:46.130: E/AndroidRuntime(17228):    at com.ihearhtpi.HADriver.testCout(Native Method)

是什么给出的?我无法弄清楚为什么这个原生呼叫无效!

2 个答案:

答案 0 :(得分:1)

显然在我的JNI文件中,我需要用

包装所有函数
#ifdef __cplusplus
extern "C" {
#endif

...JNI functions here...

#ifdef __cplusplus
}
#endif

在此之后,一切正常

答案 1 :(得分:0)

尝试不通过驱动程序调用testCout。尝试创建一个包装函数,就像driver.testCoutHelper();在onclick。

然后在testCoutHelper()(在HADriver.java中)可以调用testCout();让我们先试试看,然后告诉我结果;