android jni-dlerror报undefined symbol: JNI_OnLoad

以下是很简单的一个官方的jni方法,在MainActivity的onCreate中调用

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_openclplayground_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    auto cl_handle = dlopen("/system/vendor/lib64/libOpenCL.so",RTLD_LAZY);
    __android_log_print(ANDROID_LOG_DEBUG,"sxf","dl result2 is:%s",dlerror());

}

发现每次把app进程杀死,重进进入,这个dlerror都会打印“undefined symbol: JNI_OnLoad”

如果把同样的dlopen方法放到电脑上编译运行,肯定是没有error的,而且报错的字段中有JNI的TAG,可见这个错误是跟android有关的。

又因为dlerror的官方解释

The dlerror() function returns a human-readable, null-terminated
       string describing the most recent error that occurred from a call
       to one of the functions in the dlopen API since the last call to
       dlerror().  The returned string does not include a trailing
       newline.

可见dlerror报的错误是从上一个dlerror到这次dlerror,发生的最后一次error的信息。

所以把程序稍微改一改,改成这样

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_openclplayground_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    __android_log_print(ANDROID_LOG_DEBUG,"sxf","dl result2 is:%s",dlerror());
    auto cl_handle = dlopen("/system/vendor/lib64/libOpenCL.so",RTLD_LAZY);

}

可以看到仍然会报错“undefined symbol: JNI_OnLoad”

所以其实我们的dlopen并没有发生错误,是android系统自己dlopen某些奇怪的东西报了错,然后它又没有用dlerror清空,导致我们一开始dlopen然后再dlerror就得到了一个android 系统的dlerror。

解决方案

1、无视该错误。

2、调用dlopen前先调用一次dlerror 

 

google有点坑啊...


posted @ 2021-10-09 15:14  长尾景虎  阅读(861)  评论(0编辑  收藏  举报