这是我的情景:
- )我有一个名为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文件。
答案 0 :(得分:1)
你的签名错了。它需要是JNIEXPORT int JNICALL Java_classname_methodname(JNIENV * env,jobject obj,...)其中...是您实际想要传递的参数。无法传递指针,如果你想要一个数组,你可以使用jdoublearray,如果你想通过引用传递一个double,你需要传递一个包含double的类,并在对象