【发布时间】:2014-07-18 20:29:08
【问题描述】:
这是我的场景:
-) 我有一个由 ndk-build 生成的名为 libpsp.so 的共享库。这个库是使用大约 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 放入目录 /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 文件。
【问题讨论】:
-
首先,使用带有 -d 标志的 ndk objdump 来反汇编你的 .so 并将它的 grep 用于函数名称以找出实际存在的内容。接下来,使用隐式 root 模拟器的 adb shell,或者在设备上使用带有调试版本的 run-as 工具来检查安装并查看实际解压的内容。
标签: java android c linux android-ndk