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

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

android4.4系统解决“ERRORcouldn&#39;t find native method”方法的更多相关文章

  1. 关于解决android4.0系统中菜单无法添加Icon的问题

    在Android4.0系统中,创建菜单Menu,然后通过setIcon方法给菜单添加图标是无效的,图标不会显出来,而之前的系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 ...

  2. 解决android4.0系统中菜单(Menu)添加Icon无效问题

    本文转载自: http://blog.csdn.net/stevenhu_223/article/details/9705173 在Android4.0系统中,创建菜单Menu,通过setIcon方法 ...

  3. Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项

    本文首先总结一下Bitmap的相关概念,然后通过一个实际的问题来分析设置BitmapFactory.options的注意事项,以减少不必要的内存占用率,避免发生OOM. 一. Bitmap的使用tri ...

  4. 深入浅出-Android系统移植与平台开发(一)- Android4.0系统的下载与编译

    作者:唐老师,华清远见嵌入式学院讲师. 一.Android4.0系统的下载与编译 Android系统的下载与编译,Google的官方网站上已经给出了详细的说明,请参照Android的官方网址: htt ...

  5. Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()

    解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...

  6. 迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法

    迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法 详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com/ 用户在开发板上运 ...

  7. (原)android4.2以后获取应用程序和缓存大小的方法(源码有改变)

    以前获取应用的大小是用 PackageManager mPackageManager= getPackageManager(); try {Method getPackageSizeInfoMetho ...

  8. NDK(3)java.lang.UnsatisfiedLinkError: Native method not found解决方法

    调用native方法时报错如下 : “java.lang.UnsatisfiedLinkError: Native method not found....  ”: 原因分析: 链接器只看到了在so中 ...

  9. 嵌入式系统烧写uboot/bootloader/kernel的一般方法

    嵌入式系统烧写uboot/bootloader/kernel的一般方法   本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误, ...

随机推荐

  1. 结合Wireshark捕获分组深入理解TCP/IP协议之IP协议

    摘要:     本文简单介绍了网络层理论知识,详细讲解了IP数据报各个字段,并从Wireshark俘获分组中选取IP数据报进行分析,也阐述了分组和分片的区别.   一.IPv4数据报     网络层是 ...

  2. 【Python排序搜索基本算法】之拓扑排序

    拓扑排序是对有向无环图的一种排序,满足例如以下两个条件: 1.每一个顶点出现且仅仅出现一次. 2.若A在序列中排在B的前面.则在图中不存在从B到A的路径. 如上的无环有向图,v表示顶点:v=['a', ...

  3. ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof

    一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...

  4. Apache+tomcat的整合 分类: C_OHTERS 2014-05-07 15:08 293人阅读 评论(0) 收藏

    http://blog.csdn.net/stefyue/article/details/6918542 为什么要做这个整合呢?当然,首先想到是就是Apache和Tomcat的区别.正因为有区别,有各 ...

  5. php 过滤js字符串代码

    $str = '<script type="text/javascript" src="dd.js"></script> 测试php正则 ...

  6. Html中CSS之去除li前面的小黑点,和ul、LI部分属性方法

    对于很多人用div来做网站时,总会用到,但在显示效果时前面总是会有一个小黑点,这个令很多人头痛,但又找不到要源,其它我们可以用以下方法来清除.1.在CSS中写入代码.找到相关性的CSS,在..li和. ...

  7. DOM 的classList 属性

    1.添加1个或多个class add(class1, class2, ...) 2.移除class remove(class1, class2, ...) 3.判断指定的类名是否存在 contains ...

  8. L脚本语言实现文件加解密

    L脚本语言中能够对内存对象进行AES加解密.我们能够非常easy地实现文件加解密 #scp #定义一个秘钥字符串 定义:字符串,str1,abcdefg 打开:文件,file1,c:\1.txt 打开 ...

  9. 【转】C++11 并发指南五(std::condition_variable 详解)

    http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...

  10. js进阶 9-10 html控件如何实现点击自动选择控件内容

    js进阶 9-10  html控件如何实现点击自动选择控件内容 一.总结 一句话总结: 1.在click事件中,如果focus,那就select 2.blur 1.html中控件添加两种方式? 在表单 ...