Android4.4 system solution "ERRORcouldn't find native method"
Today, I am porting a TV module from android4.2 TO THE android4.4 system device. The same Code, the same method, cannot run. The general method is to write an apk on the upper layer and call a static java library. The java library loads the library file that calls JNI. This set of code is good on 4.2 and can run normally, there is no problem in compiling when I move to 4.4. the following problem occurs during running:
/*************************************** **************************************** **********************/
Statement: the content of this blog is created at http://blog.csdn.net/edsam49. please refer to it for help. Thank you!
/*************************************** **************************************** **********************/
The error message is as follows:
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 213907-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.cvbs07-01 20:57:29.540 D/dalvikvm( 2891): DexOpt: load 14ms, verify+opt 41ms, 273740 bytes07-01 20:57:29.570 V/PhoneStatusBar( 1691): setLightsOn(true)07-01 20:57:29.800 E/dalvikvm( 2878): ERROR: couldn't find native method07-01 20:57:29.800 E/dalvikvm( 2878): Requested: Lsoftwinner/tv/TVDecoder;.connect:(IIII)I07-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 NATIVE07-01 20:57:29.800 I/dalvikvm( 2878): | group="main" sCount=0 dsCount=0 obj=0x41533c90 self=0x4146c58007-01 20:57:29.800 I/dalvikvm( 2878): | sysTid=2878 nice=0 sched=0/0 cgrp=apps handle=107387323607-01 20:57:29.810 I/dalvikvm( 2878): | state=R schedstat=( 0 0 0 ) utm=11 stm=6 core=107-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.so07-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.so07-01 20:57:29.820 I/dalvikvm( 2878): #09 pc 00026f60 /system/lib/libdvm.so07-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.so07-01 20:57:29.820 I/dalvikvm( 2878): #20 pc 00026f60 /system/lib/libdvm.so07-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.so07-01 20:57:29.820 I/dalvikvm( 2878): #25 pc 0004ce80 /system/lib/libandroid_runtime.so07-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_process07-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.
(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
It is a tragedy. I have honestly checked several times, including package reference, native name, jin name ing, and compilation. Why? I also Google it again. Fortunately, there are some people in the same path! It's all about proguard! It may optimize these jni native classes. When compiling static java libraries, if proguard is not specified, problems may occur. Let's look at the java_library.mk file of the build system:
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)endififdef LOCAL_DEX_PREOPTdexpreopt_boot_jar_module := $(filter $(LOCAL_MODULE),$(DEXPREOPT_BOOT_JARS_MODULES))ifneq ($(dexpreopt_boot_jar_module),)# boot jar's rules are defined in dex_preopt.mkdexpreopted_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).odexbuilt_odex := $(basename $(LOCAL_BUILT_MODULE)).odex$(built_odex) : $(dexpreopted_boot_odex) | $(ACP)$(call copy-file-to-target)else # dexpreopt_boot_jar_modulebuilt_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,$@)endifendif # dexpreopt_boot_jar_moduleelse # LOCAL_DEX_PREOPT$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP)$(call copy-file-to-target)endif # LOCAL_DEX_PREOPTendif # !LOCAL_IS_STATIC_JAVA_LIBRARY
LOCAL_PROGUARD_ENABLED is enabled by default. If it is not specified, it works and may be optimized. This feature reminds me of the need to add volitate to the underlying register operation long ago to prevent the compiler from doing the same optimization.
You only need to add a row to Makefile. As follows:
LOCAL_PROGUARD_ENABLED: = disabled
Compilation is still the same, running is still the same, but it is really good, not clear before, very tired, come on!