android4.4系统解决“ERRORcouldn't find native method”方法

android4.4系统解决“ERRORcouldn't find native method”方法

 

          今天笔者在移植一个tv模块从android4.2到android4.4系统的设备上,同样的代码,同样的方法,就是运行不起来。大概方法就是上层写一个apk,调用一个静态的java库,java库加载调用JNI的库文件,这一套代码在4.2上都是好好的,正常能跑,移到4.4上编译也都没有问题,运行会出下面的问题:

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

    错误信息如下:

07-01 20:57:29.200 I/ActivityManager( 1613): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.softwinner.cvbs/.CVBS} from pid 2139
07-01 20:57:29.320 I/ActivityManager( 1613): Start proc com.softwinner.cvbs for activity com.softwinner.cvbs/.CVBS: pid=2878 uid=10022 gids={50022}
07-01 20:57:29.420 I/PackageManager( 1613): Running dexopt on: com.softwinner.cvbs
07-01 20:57:29.540 D/dalvikvm( 2891): DexOpt: load 14ms, verify+opt 41ms, 273740 bytes
07-01 20:57:29.570 V/PhoneStatusBar( 1691): setLightsOn(true)
07-01 20:57:29.800 E/dalvikvm( 2878): ERROR: couldn't find native method
07-01 20:57:29.800 E/dalvikvm( 2878): Requested: Lsoftwinner/tv/TVDecoder;.connect:(IIII)I
07-01 20:57:29.800 E/dalvikvm( 2878): JNI posting fatal error: RegisterNatives failed for 'softwinner/tv/TVDecoder'; aborting...
07-01 20:57:29.800 I/dalvikvm( 2878): "main" prio=5 tid=1 NATIVE
07-01 20:57:29.800 I/dalvikvm( 2878):   | group="main" sCount=0 dsCount=0 obj=0x41533c90 self=0x4146c580
07-01 20:57:29.800 I/dalvikvm( 2878):   | sysTid=2878 nice=0 sched=0/0 cgrp=apps handle=1073873236
07-01 20:57:29.810 I/dalvikvm( 2878):   | state=R schedstat=( 0 0 0 ) utm=11 stm=6 core=1
07-01 20:57:29.820 I/dalvikvm( 2878):   #00  pc 000012f6  /system/lib/libcorkscrew.so (unwind_backtrace_thread+29)
07-01 20:57:29.820 I/dalvikvm( 2878):   #01  pc 000604ec  /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+31)
07-01 20:57:29.820 I/dalvikvm( 2878):   #02  pc 000544e8  /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+395)
07-01 20:57:29.820 I/dalvikvm( 2878):   #03  pc 00054556  /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+25)
07-01 20:57:29.820 I/dalvikvm( 2878):   #04  pc 00048f90  /system/lib/libdvm.so
07-01 20:57:29.820 I/dalvikvm( 2878):   #05  pc 00001fd2  /system/lib/libnativehelper.so (jniRegisterNativeMethods+81)
07-01 20:57:29.820 I/dalvikvm( 2878):   #06  pc 00000ac6  /system/lib/libtvdecoder_jni.so (JNI_OnLoad+41)
07-01 20:57:29.820 I/dalvikvm( 2878):   #07  pc 0004feba  /system/lib/libdvm.so (dvmLoadNativeCode(char const*, Object*, char**)+465)
07-01 20:57:29.820 I/dalvikvm( 2878):   #08  pc 00067590  /system/lib/libdvm.so
07-01 20:57:29.820 I/dalvikvm( 2878):   #09  pc 00026f60  /system/lib/libdvm.so
07-01 20:57:29.820 I/dalvikvm( 2878):   #10  pc 0002deec  /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
07-01 20:57:29.820 I/dalvikvm( 2878):   #11  pc 0002b598  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
07-01 20:57:29.820 I/dalvikvm( 2878):   #12  pc 0006041e  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+337)
07-01 20:57:29.820 I/dalvikvm( 2878):   #13  pc 00060442  /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+19)
07-01 20:57:29.820 I/dalvikvm( 2878):   #14  pc 0006ba88  /system/lib/libdvm.so (dvmInitClass+1019)
07-01 20:57:29.820 I/dalvikvm( 2878):   #15  pc 00021e5c  /system/lib/libdvm.so (dvmAsmSisterStart+412)
07-01 20:57:29.820 I/dalvikvm( 2878):   #16  pc 0002deec  /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
07-01 20:57:29.820 I/dalvikvm( 2878):   #17  pc 0002b598  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
07-01 20:57:29.820 I/dalvikvm( 2878):   #18  pc 00060700  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+391)
07-01 20:57:29.820 I/dalvikvm( 2878):   #19  pc 0006866e  /system/lib/libdvm.so
07-01 20:57:29.820 I/dalvikvm( 2878):   #20  pc 00026f60  /system/lib/libdvm.so
07-01 20:57:29.820 I/dalvikvm( 2878):   #21  pc 0002deec  /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
07-01 20:57:29.820 I/dalvikvm( 2878):   #22  pc 0002b598  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
07-01 20:57:29.820 I/dalvikvm( 2878):   #23  pc 0006041e  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+337)
07-01 20:57:29.820 I/dalvikvm( 2878):   #24  pc 00049bda  /system/lib/libdvm.so
07-01 20:57:29.820 I/dalvikvm( 2878):   #25  pc 0004ce80  /system/lib/libandroid_runtime.so
07-01 20:57:29.820 I/dalvikvm( 2878):   #26  pc 0004dba6  /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+353)
07-01 20:57:29.830 I/dalvikvm( 2878):   #27  pc 0000105a  /system/bin/app_process
07-01 20:57:29.830 I/dalvikvm( 2878):   #28  pc 0000e3e8  /system/lib/libc.so (__libc_init+47)
07-01 20:57:29.830 I/dalvikvm( 2878):   at java.lang.Runtime.nativeLoad(Native Method)
07-01 20:57:29.830 I/dalvikvm( 2878):   at java.lang.Runtime.doLoad(Runtime.java:421)
07-01 20:57:29.830 I/dalvikvm( 2878):   at java.lang.Runtime.loadLibrary(Runtime.java:362)
07-01 20:57:29.830 I/dalvikvm( 2878):   at java.lang.System.loadLibrary(System.java:526)
07-01 20:57:29.830 I/dalvikvm( 2878):   at softwinner.tv.TVDecoder.<clinit>(TVDecoder.java:11)
07-01 20:57:29.830 I/dalvikvm( 2878):   at com.softwinner.cvbs.CVBS.onCreate(CVBS.java:-1)
07-01 20:57:29.830 I/dalvikvm( 2878):   at android.app.Activity.performCreate(Activity.java:5243)
07-01 20:57:29.830 I/dalvikvm( 2878):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-01 20:57:29.830 I/dalvikvm( 2878):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
07-01 20:57:29.830 I/dalvikvm( 2878):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.j

     很悲剧,老老实实查了几遍,包引用,native名称,jin名称映射,编译这些看起来都没有问题,为什么呢?笔者也Google了一遍,还好有一些同道中人啊!都是proguard惹的祸!因为它可能会优化掉这些jni native类,在编译静态java库的时候,如果不特别指定proguard的话,会出问题,下面看看build系统的 java_library.mk文件:

ifeq ($(LOCAL_PROGUARD_ENABLED),disabled)
  LOCAL_PROGUARD_ENABLED :=
endif
ifeq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true)
# No dex; all we want are the .class files with resources.
$(common_javalib.jar) : $(java_resource_sources)
ifdef LOCAL_PROGUARD_ENABLED
$(common_javalib.jar) : $(full_classes_proguard_jar)
else
$(common_javalib.jar) : $(full_classes_jar)
endif
	@echo "target Static Jar: $(PRIVATE_MODULE) ($@)"
	$(copy-file-to-target)
ifneq ($(extra_jar_args),)
	$(add-java-resources-to-package)
endif

$(LOCAL_BUILT_MODULE): $(common_javalib.jar)
	$(copy-file-to-target)

else # !LOCAL_IS_STATIC_JAVA_LIBRARY

$(common_javalib.jar): PRIVATE_DEX_FILE := $(built_dex)
$(common_javalib.jar) : $(built_dex) $(java_resource_sources)
	@echo "target Jar: $(PRIVATE_MODULE) ($@)"
	$(create-empty-package)
	$(add-dex-to-package)
	$(add-carried-java-resources)
ifneq ($(extra_jar_args),)
	$(add-java-resources-to-package)
endif

ifdef LOCAL_DEX_PREOPT
dexpreopt_boot_jar_module := $(filter $(LOCAL_MODULE),$(DEXPREOPT_BOOT_JARS_MODULES))
ifneq ($(dexpreopt_boot_jar_module),)
# boot jar's rules are defined in dex_preopt.mk
dexpreopted_boot_jar := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(dexpreopt_boot_jar_module)_nodex.jar
$(LOCAL_BUILT_MODULE) : $(dexpreopted_boot_jar) | $(ACP)
	$(call copy-file-to-target)

dexpreopted_boot_odex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(dexpreopt_boot_jar_module).odex
built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex
$(built_odex) : $(dexpreopted_boot_odex) | $(ACP)
	$(call copy-file-to-target)

else # dexpreopt_boot_jar_module
built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex
$(built_odex): PRIVATE_MODULE := $(LOCAL_MODULE)
# Make sure the boot jars get dex-preopt-ed first
$(built_odex) : $(DEXPREOPT_BOOT_ODEXS)
$(built_odex) : $(common_javalib.jar) | $(DEXPREOPT) $(DEXOPT)
	@echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)"
	$(hide) rm -f $@
	@mkdir -p $(dir $@)
	$(call dexpreopt-one-file,$<,$@)

$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP)
	$(call copy-file-to-target)
ifneq (nostripping,$(LOCAL_DEX_PREOPT))
	$(call dexpreopt-remove-classes.dex,$@)
endif

endif # dexpreopt_boot_jar_module

else # LOCAL_DEX_PREOPT
$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP)
	$(call copy-file-to-target)

endif # LOCAL_DEX_PREOPT
endif # !LOCAL_IS_STATIC_JAVA_LIBRARY

     LOCAL_PROGUARD_ENABLED默认是打开的,不特别指定的话,就是起作用的,就可能做优化。这个功能让我想起来了,很早以前做很底层寄存器操作的时候,要加上volitate 来防止编译器做优化一样。 
       只需要再Makefile中加入一行即可解决。如下:

LOCAL_PROGUARD_ENABLED:= disabled

       编译还是照旧,运行还是照旧,可是就是出来了,真的不错,没搞清楚之前,很累人啊,加油!

 

 

 

 

时间: 2025-01-29 16:23:15

android4.4系统解决“ERRORcouldn't find native method”方法的相关文章

win8系统解决共享打印机拒绝访问的方法

  Win8共享打印机拒绝访问的解决方法. 解决方法如下: 1.在共享打印机的计算机上,打开控制面板,单击"查看设备和打印机" 查看设备和打印机 2.在打开的设备列表,右键单击共享的打印机,单击"打印机属性",选中这台打印机 打印机属性 3.在"共享"选项卡下,填写正确的"共享名" 共享名 4.打开"安全"选项卡,可以看到在"组或用户名"下没有"everyone"这一

基于android4.4系统行车记录应用黑屏问题分析及对策

基于android4.4系统行车记录应用黑屏问题分析及对策           笔者最近遇到一个棘手的问题,那就是行车记录应用出现黑屏的问题,现象就是进入行车记录应用surface是黑的,录像文件几分钟一个的那种,每个文件的大小都是零.看到这个大家都非常重视,对于车载产品来说,行车记录功能需要保持长时间正常工作,出现这种问题肯定是不能接受的,必须解决!那这个问题是怎么出现的呢?        跟了很长时间,同时动用了8台相同的机器来单独做行车记录的拷机测试,12个小时内都不会出问题,但是超过24

解决Windows7系统中快捷键切换输入法失灵的方法

首先,看看是不是只在 Word 文档中出现输入法切换问题.下面三联网以Win7的好搭档,Office2010中的Word 文档为例,来看看这个输入法切换的解决方法: a.在word的菜单里点击"文件-选项": b.在"选项"窗口,单击"高级",然后从右侧细节窗口找到"输入法控制处于活动状态",将其勾选. c.重启 Word,察看一下问题是否解决. 当然,如果不仅 Word 中输入法切换失效,在其它应用(如记事本)中也照样无法切

Ubuntu15.04系统解决新增用户不能登录该怎么办?

  Ubuntu15.04系统解决新增用户不能登录该怎么办?我们新增了一位标准用户hanmeimei,一位管理员用户MrWang.大家在新增好用户后,肯定跃跃欲试的想用这个新用户登录.不过,我们会发现我们是无法使用新用户登录进系统的.今天,这个经验我们就和大家一起来解决这个问题. 1.我们先打开"用户帐户"管理窗口.先查看下目前的用户. 2.我们先查看下新增用户hanmeimei和MrWang的一些信息. 3.好,我们先重启下系统,看是否可以用新用户成功登录.在登录窗口,我们发现,准备

如何解决Win8.1系统蓝屏出现错误代码0x0000013a的方法

  如何解决Win8.1系统蓝屏出现错误代码0x0000013a的方法.win8.1系统发生蓝屏问题已经属于常见问题之一,之前小编也介绍很多关于解决蓝屏的方法,一般都会根据提示的代码找回故障原因.这不有位Win8.1系统发生多次蓝屏,重新启动系统也会发生蓝屏,蓝屏提示的错误代码为0x0000013a,怎么办?这有可能是硬件的问题,大家不必太担心,下面小编分享详细解决方法. 具体步骤: 1.右键单击桌面上的 计算机,选择属性,选择左侧的 高级系统设置; 2. 单击 启动与故障恢复 里的 设置,将

解决win8系统下iTunes重复安装失败的方法

  iTunes 是由苹果电脑推出的一款免费的数字媒体播放应用程序,安装完成后就能很方便的管理和播放音乐.视频等,最近有网友反应在win8系统下安装iTunes出错,不但安装失败,而且还一直重复安装个不停,像是中了病毒一样,遇到这种情况应该怎么办呢,请看小编的解决方法. 解决win8系统下iTunes重复安装失败的方法 1.在安装时出现2503的错误代码; 2.点击确定后,出现"iTunes 被配置前,安装程序发生错误"的对话框,点击 "结束"来退出安装; 3.右击

解决win7系统右下角弹出广告的图文方法

  很多win7系统用户向小编反映,在没有运行win7系统下的任何应用程序时,系统右下角突然就弹出窗口广告,一开始以为是某些软件造成的,故此将软件卸载后测试还是出现弹出广告的问题,对于该问题我们如何解决呢?下面看小编为您提供的解决方法! 解决win7系统右下角弹出广告的图文方法 方法一: 使用360安全卫士检测并修复DNS; 方法二: 1.右键点击右下角网络图标,打开网络和共享中心,然后点击更改适配器设置; 2.找到你的本地连接,如果你使用无线那么右键点击无线连接,打开属性,然后双击 inter

电脑一直正在启动windows进不去系统解决办法

  电脑一直正在启动windows进不去系统解决办法 这是电脑磁盘出了问题请修复一下(每个磁盘都试着修复一下或只修复提示的某盘符). 电脑系统自带磁盘修复教程: 在我的电脑中选中盘符后单击鼠标右键选属性,在弹出的驱动器属性窗口中依次选择"工具→开始检查"并选择"自动修复文件系统错误"和"扫描并恢复坏扇区",然后点击开始,扫描时间将会因磁盘容量及扫描选项的不同而有所差异有长有短(按上面的方法做后,会弹出一个框,点是,自动关机后在开机进行修复,Win

滑动-pinterestlikeadapterview 在android4.3系统中会有卡顿怎么破?

问题描述 pinterestlikeadapterview 在android4.3系统中会有卡顿怎么破? 用pinterestlikeadapterview 实现瀑布流,在android4.3系统中会有滑动卡顿的情况,有遇到过的吗求大神支招