在Android应用上加载现有共享库(.so)时出错(未找到未满足的linkerror本机方法)

时间:2014-07-18 20:29:09

标签: java android c linux android-ndk

这是我的情景:

- )我有一个名为libpsp.so的共享库,由ndk-build生成。这个lib是使用大约30个.c文件生成的。

Android.mk使用:

    LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE    := psp
LOCAL_SRC_FILES := (My .c files)

include $(BUILD_SHARED_LIBRARY)

- )ndk-build自动将libpsp.so放在dir / libs / armeabi中

- )在我的Java代码中,我有:

    private native int calculateCoefficient(double w, double v_st_e_prev, double c_l);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    **//Loads successfully
    System.loadLibrary("psp");**

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
    TextView lv = (TextView)findViewById(R.id.textView);

    **//Returns an error: unsatisfiedlinkerror native method not found
    lv.setText(Integer.toString(calculateCoefficient(1,1,1)));**
}

- )用于构建共享库的.c文件之一具有带签名的calculateCoefficient方法:

sint32_t calculateCoefficient(double_t w, double_t v_st_e_prev, double_t *c_l);

因此,如果.so库中存在calculateCoefficient方法,为什么Android无法找到它?我刚刚开始与NDK合作,很抱歉,如果我错过了一些显而易见的事情,但我已经做了一些研究,我找不到答案。

UPDATE1:我无法访问实际代码,该库是由其他人生成的,我所拥有的只是具有方法签名的.h文件。所以我无法编辑用于创建库的.c文件。

1 个答案:

答案 0 :(得分:1)

你的签名错了。它需要是JNIEXPORT int JNICALL Java_classname_methodname(JNIENV * env,jobject obj,...)其中...是您实际想要传递的参数。无法传递指针,如果你想要一个数组,你可以使用jdoublearray,如果你想通过引用传递一个double,你需要传递一个包含double的类,并在对象