【问题标题】:Cannot resolve corresponding JNI function with .so file无法使用 .so 文件解析对应的 JNI 函数
【发布时间】:2016-05-04 17:08:31
【问题描述】:

我对 JNI 完全陌生,我必须使用现有的已编译 .so 文件。 问题是 Android Studio 无法找到 JNI 函数。 我使用与此类似的代码加载我的库:

public class MyService extends Service{

    static {
        System.loadLibrary("mylib");
    }

    private native void example();

}

它给了我一个错误“无法解析相应的 JNI 函数 Java_com_company_app_MyService_example”。

如果我运行这个命令(在终端中)

arm-linux-androideabi-nm -DC mylib.so

我得到,在其他人之间(我只需要库的几个功能),

register_com_company_app_service(_JNIEnv*)

(代替MyService有服务)

我能做什么?加载库是否有问题或其他问题?

我也尝试在“服务”中折射类名称“MyService”,但“Java_com_company_app_service_example”也没有解析!

提前致谢!

【问题讨论】:

  • 您是否在 build.gradle 上实现了该库?
  • 呃,不……我该怎么办?
  • 检查我的答案如何在AndroidStudio 中包含*.so 文件,也许可以帮助你,stackoverflow.com/a/33164947/3626214
  • 它没有帮助。如果有帮助,我只有(一个)so 文件,没有 jar
  • 您是否看到以Java_ 开头的导出函数?而且您不应该将-C 用于nm 命令!

标签: java android android-ndk java-native-interface native


【解决方案1】:

您需要记住,函数签名必须与其在 Java 中的名称匹配,并且必须导出。
此外,成员函数接收对象作为第一个参数,而静态函数接收类。

#ifdef __cplusplus
extern "C" {
#endif
 JNIEXPORT void JNICALL Java_Namespace_Class_MemberFunction
        (JNIEnv *, jobject);

 JNIEXPORT void JNICALL Java_Namespace_Class_StaticFunction
        (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif

所以你的情况是:

 JNIEXPORT void JNICALL Java_com_company_app_MyService_example
        (JNIEnv *, jobject);

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多