求助jni 加载so库的问题

lishi_1991 2014-12-23 05:02:05
我在网上找了一些资料编写了一个jni库,用来显示yuv数据,里面用到了一些android源码的库文件如下:

#include <assert.h>
#include <JNIHelp.h>
#include <utils/Log.h>
#include <gui/Surface.h>
#include <cutils/properties.h>
#include <ui/GraphicBufferMapper.h>
#include <media/stagefright/foundation/ADebug.h>
#include <android_runtime/android_view_Surface.h>

所以对Android.mk做了修改,包含Android源码 Android.mk内容如下:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := showYUV

MY_ANDROID_SOURCE = D:/Android/java_software/android_4.4
MY_ANDROID_SYSLIB = $(MY_ANDROID_SOURCE)/out/target/product/generic/system/lib

MY_FILES_PATH := $(LOCAL_PATH)
MY_FILES_SUFFIX := %.cpp %.c

rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

MY_ALL_FILES := $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*.*))
MY_ALL_FILES := $(MY_ALL_FILES:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%)
MY_SRC_LIST := $(filter $(MY_FILES_SUFFIX),$(MY_ALL_FILES))
MY_SRC_LIST := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)

MY_ALL_DIRS := $(dir $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*/)))
MY_ALL_DIRS := $(call uniq,$(MY_ALL_DIRS))

LOCAL_SRC_FILES := $(MY_SRC_LIST)
LOCAL_C_INCLUDES := $(MY_ALL_DIRS)

LOCAL_CPPFLAGS += -fexceptions -DXLOCALE_NOT_USED=1 -DNULL=0 -DNO_SSTREAM=1 -UIP_ADD_SOURCE_MEMBERSHIP

LOCAL_STATIC_LIBRARIES := \
libstagefright_color_conversion\
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
libui \
libgui \
libstagefright\
libstagefright_foundation

LOCAL_C_INCLUDES += \
$(MY_ANDROID_SOURCE)/external/opencore/codecs_v2/video/mfc_c110/include \
$(MY_ANDROID_SOURCE)/libnativehelper/include/nativehelper \
$(MY_ANDROID_SOURCE)/frameworks/native/include \
$(MY_ANDROID_SOURCE)/frameworks/av/include \
$(MY_ANDROID_SOURCE)/frameworks/base/include \
$(MY_ANDROID_SOURCE)/hardware/libhardware/include \
$(MY_ANDROID_SOURCE)/system/core/include

# for logging
LOCAL_LDLIBS += -llog
LOCAL_LDLIBS += -landroid -lstdc++
LOCAL_LDFLAGS += -fuse-ld=bfd
//LOCAL_CXXFLAGS := -DHAVE_PTHREADS
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(BUILD_SHARED_LIBRARY)

$(call import-module,cpufeatures)

$(warning $(LOCAL_SRC_FILES))
$(warning $(MY_INCLUDE_LIST))

编译通过生成so文件,但是在运行加载so文件时报错 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZNK7android7RefBase9decStrongEPKv" 查了一下有的说是因为android ndk版本太高导致的
我的Android ndk版本是 ndk-r10 Android源码版本是4.4的 Android软件要多平台支持 从4.0~4.4的 所以我想向各位质询一下这个问题怎么解决呢。
...全文
7644 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sai275288698 2017-05-09
  • 打赏
  • 举报
回复
安卓是支持直接渲染yuv的
大卫德 2017-04-15
  • 打赏
  • 举报
回复
编译器Android版本,手机Android版本,NDK对应的Android版本,三者要相同。
gismjm 2016-03-06
  • 打赏
  • 举报
回复
4.03可以,4.4.2 4.4.4还是不行
gismjm 2016-03-01
  • 打赏
  • 举报
回复
怎么不要让ndk-build自动删除.so www.MyException.Cn 网友分享于:2015-08-05 浏览:0次 如何不要让ndk-build自动删除.so 在用ndk-build的时候突然发现在编译完成之后会自动删除armeabi下面所有的so文件,这就会有问题,因为我目录下还放了其它第三方的so文件,这要是删除了岂不是出问题了... 解决办法: 把所有的第三方so文件放到jni目录下,然后在mk文件最后加上如下: include $(CLEAR_VARS) LOCAL_MODULE := libxxx LOCAL_SRC_FILES := libxxx.so include $(PREBUILT_SHARED_LIBRARY) 这样再编译的时候会从jni目录复制到armeabi目录下。
gismjm 2016-03-01
  • 打赏
  • 举报
回复
我解决了 办法如下,从安卓源码中复制 so到项目的lib目录下, 复制libgui.so libui.so libusbhost.so libutils.so libsurfaceflinger.so libsurfaceflinger_client.so 源码目录是 \WORKING_DIRECTORY\out\target\product\generic\system\lib 复制到libs\armeabi 和你的项目的so在一起
lishi_1991 2015-09-05
  • 打赏
  • 举报
回复
结贴,最终还是放弃安卓开发直接用vlc开源lib库
liuh6 2015-03-11
  • 打赏
  • 举报
回复
引用 12 楼 lishi_1991 的回复:
[quote=引用 11 楼 liuh6 的回复:] [quote=引用 10 楼 lishi_1991 的回复:] [quote=引用 8 楼 wasdwqwq 的回复:] 楼主问题有解决吗?分享一下,我也遇到同样问题了
没有解决,最后不得已放弃了显示yuv的方法[/quote] android 本身就不能显示YUV 可以把yuv的数据转成 RGB后再显示[/quote] 一旦转换成rgb就存在效率问题,普通公式法转化效率极低,即使查表法转化效率也不高,如果显示小分辨率没问题,但是显示大分辨率视频,或者再加上一些视频处理的东西,转化的效率影响就很大,我用小米3测试720x476的视频查表转化要花费将近20ms,如果视频流是25帧的话,一帧间隔只有40ms,这个转化太耗费时间了,如果视频是720p或者更高的1080p的耗费时间会更大。 我不是专业做android视频显示的,甚至不是做android开发的,也不知道有没有一种方法可以直接渲染yuv数据,或者将yuv转rgb显示用硬件处理。[/quote] 确实有这个问题,我以前用过yuv转rgb用jni在做的,转换效率可以接爱,我转的是720p的
lishi_1991 2015-03-10
  • 打赏
  • 举报
回复
引用 11 楼 liuh6 的回复:
[quote=引用 10 楼 lishi_1991 的回复:] [quote=引用 8 楼 wasdwqwq 的回复:] 楼主问题有解决吗?分享一下,我也遇到同样问题了
没有解决,最后不得已放弃了显示yuv的方法[/quote] android 本身就不能显示YUV 可以把yuv的数据转成 RGB后再显示[/quote] 一旦转换成rgb就存在效率问题,普通公式法转化效率极低,即使查表法转化效率也不高,如果显示小分辨率没问题,但是显示大分辨率视频,或者再加上一些视频处理的东西,转化的效率影响就很大,我用小米3测试720x476的视频查表转化要花费将近20ms,如果视频流是25帧的话,一帧间隔只有40ms,这个转化太耗费时间了,如果视频是720p或者更高的1080p的耗费时间会更大。 我不是专业做android视频显示的,甚至不是做android开发的,也不知道有没有一种方法可以直接渲染yuv数据,或者将yuv转rgb显示用硬件处理。
liuh6 2015-03-09
  • 打赏
  • 举报
回复
提示很明确。用android NDK r8 或r9重编一下试试!
liuh6 2015-03-09
  • 打赏
  • 举报
回复
引用 10 楼 lishi_1991 的回复:
[quote=引用 8 楼 wasdwqwq 的回复:] 楼主问题有解决吗?分享一下,我也遇到同样问题了
没有解决,最后不得已放弃了显示yuv的方法[/quote] android 本身就不能显示YUV 可以把yuv的数据转成 RGB后再显示
lishi_1991 2015-03-09
  • 打赏
  • 举报
回复
引用 8 楼 wasdwqwq 的回复:
楼主问题有解决吗?分享一下,我也遇到同样问题了
没有解决,最后不得已放弃了显示yuv的方法
wasdwqwq 2015-03-07
  • 打赏
  • 举报
回复
楼主问题有解决吗?分享一下,我也遇到同样问题了
bit_blue_wind 2014-12-30
  • 打赏
  • 举报
回复
因为你这里只有Android.mk,没有程序代码,有些调用方式不对,也会出现这样的提示,最好能有调用代码看看
passself 2014-12-30
  • 打赏
  • 举报
回复
_ZNK7android7RefBase9decStrongEPKv 这个是用到的函数是在2.2下面才可以使用,在2.2之后播放框架修改了,无法找到这个函数了。
lishi_1991 2014-12-30
  • 打赏
  • 举报
回复
引用 4 楼 yeshiyuan1 的回复:
我也遇到了这个问题,不知道怎么解决。
我已经无奈了,那个东西现在也没解决 好像因为无法链接到安卓源码里的一些函数,需要在安卓源码环境下编译,而非android-ndk编译 jni
yeshiyuan1 2014-12-24
  • 打赏
  • 举报
回复
我也遇到了这个问题,不知道怎么解决。
lishi_1991 2014-12-23
  • 打赏
  • 举报
回复
没人遇到这个问题吗
lishi_1991 2014-12-23
  • 打赏
  • 举报
回复
我找了一个android4.4的手机,运行apk加载程序也会报同样的错,求助啊 各位有什么解决方法吗
lishi_1991 2014-12-23
  • 打赏
  • 举报
回复
对了 我的AndroidMainefest.xml 版本支持是
<uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="18" />
jni的Application.mk 也添加了:
APP_ABI := all
APP_PLATFORM := android-14  
APP_STL := gnustl_shared
我也验证过 去掉包含的众多头文件 和所有的函数实现,只保留一个实现print功能的jni函数,Makefile不做任何更改,是可以加载so库的 也就是说so库路径肯定没错 这个是不是需要我从新下载Android低版本的源码文件啊

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧