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

简介: android4.4系统解决“ERRORcouldn't find native method”方法           今天笔者在移植一个tv模块从android4.2到android4.4系统的设备上,同样的代码,同样的方法,就是运行不起来。

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

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

 

 

 

 


目录
相关文章
|
10月前
|
Android开发 开发者
Android自定义view之利用drawArc方法实现动态效果
本文介绍了如何通过Android自定义View实现动态效果,重点使用`drawArc`方法完成圆弧动画。首先通过`onSizeChanged`进行测量,初始化画笔属性,设置圆弧相关参数。核心思路是不断改变圆弧扫过角度`sweepAngle`,并调用`invalidate()`刷新View以实现动态旋转效果。最后附上完整代码与效果图,帮助开发者快速理解并实践这一动画实现方式。
233 0
|
6月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
432 6
|
6月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
8月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
528 11
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
393 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
11月前
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
355 18
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。