最近得论坛高人指点正在做一个java --->service---> jni ---> HAL --->driver的一个应用。现在遇到一个瓶颈:我的hal模块在/hardware/目录下,经过编译形成so文件在out/.../system/lib/hw/*.sojni模块在framework/sevice/jni目录下,经过编译形成so文件在out/.../system/lib/*_runtime.soservice在framework/sevice/java目录下,经过编译形成jar文件在out/.../system/framework/*.jarjava应用程序中import了上述jar文件中的需要的类,编译和安装成功之后运行居然出现了找不到类定义的错误。
而这个找不到的类定义就在*.jar中,为什么编译能过,运行却找不到呢?我用adb shell进入了开发板的/system/framework目录看到这个jar文件存在(被编入镜像)。这个问题百思不得其解啊!!大家有没有啥经验,分享分享!!!

解决方案 »

  1.   

    确实郁闷,难道和platform.xml有关?
      

  2.   

    顺道问一下:
    LOCAL_NO_STANDARD_LIBRARIES := true
    是什么意思啊
      

  3.   

    运行期出错楼主有没到adb shell -> system/lib下看你编译出的。so文件都全了吗
      

  4.   

    如果它的静态文件漏掉了 , .JAR应该编不过吧
      

  5.   


    是的,编译都过了!就是运行时候找不到,部分调试信息:D/installd(  830): DexInv: --- BEGIN '/system/app/Usb3g.apk' ---
    D/dalvikvm( 1153): DexOpt: load 28ms, verify 29ms, opt 1ms
    D/installd(  830): DexInv: --- END '/system/app/Usb3g.apk' (success) ---
    W/dalvikvm( 1146): VFY: unable to find class referenced in signature (Lcom/seuic/server/Usb3gService;)
    E/dalvikvm( 1146): Could not find class 'com.seuic.server.Usb3gService', referenced from method com.seuic.usb3g.Usb3g$1.onClick
    W/dalvikvm( 1146): VFY: unable to resolve new-instance 17 (Lcom/seuic/server/Usb3gService;) in Lcom/seuic/usb3g/Usb3g$1;
    D/dalvikvm( 1146): VFY: replacing opcode 0x22 at 0x0018
    D/dalvikvm( 1146): Making a copy of Lcom/seuic/usb3g/Usb3g$1;.onClick code (84 bytes)
    I/ActivityManager(  903): Displayed activity com.seuic.usb3g/.Usb3g: 882 ms (total 882 ms)
    I/connect...( 1146): connect to 3g
    I/Usb3gTest( 1146): Creat a new Usb3gService object.
    D/AndroidRuntime( 1146): Shutting down VM
    W/dalvikvm( 1146): threadid=3: thread exiting with uncaught exception (group=0x4001b160)
    E/AndroidRuntime( 1146): Uncaught handler: thread main exiting due to uncaught exception
    E/AndroidRuntime( 1146): java.lang.NoClassDefFoundError: com.seuic.server.Usb3gService
    E/AndroidRuntime( 1146):  at com.seuic.usb3g.Usb3g$1.onClick(Usb3g.java:62)
    E/AndroidRuntime( 1146):  at android.view.View.performClick(View.java:2364)
    E/AndroidRuntime( 1146):  at android.view.View.onTouchEvent(View.java:4179)
    E/AndroidRuntime( 1146):  at android.widget.TextView.onTouchEvent(TextView.java:6543)
    E/AndroidRuntime( 1146):  at android.view.View.dispatchTouchEvent(View.java:3709)
    E/AndroidRuntime( 1146):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
    E/AndroidRuntime( 1146):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
    E/AndroidRuntime( 1146):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
    E/AndroidRuntime( 1146):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
    E/AndroidRuntime( 1146):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
    E/AndroidRuntime( 1146):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
    E/AndroidRuntime( 1146):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
    E/AndroidRuntime( 1146):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
    E/AndroidRuntime( 1146):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
    E/AndroidRuntime( 1146):  at android.os.Handler.dispatchMessage(Handler.java:99)
    E/AndroidRuntime( 1146):  at android.os.Looper.loop(Looper.java:123)
    E/AndroidRuntime( 1146):  at android.app.ActivityThread.main(ActivityThread.java:4363)
    E/AndroidRuntime( 1146):  at java.lang.reflect.Method.invokeNative(Native Method)
    E/AndroidRuntime( 1146):  at java.lang.reflect.Method.invoke(Method.java:521)
    E/AndroidRuntime( 1146):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    E/AndroidRuntime( 1146):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    E/AndroidRuntime( 1146):  at dalvik.system.NativeStart.main(Native Method)
      

  6.   

    参考你的调试信息:
    /dalvikvm( 1146): VFY: unable to find class referenced in signature (Lcom/seuic/server/Usb3gService;)
    E/dalvikvm( 1146): Could not find class 'com.seuic.server.Usb3gService', referenced from method com.seuic.usb3g.Usb3g$1.onClick
    你的应用中是不是调用了非标模块,
    这里是'com.seuic.server.Usb3gService'(USB串口通信服务)
      

  7.   

    JNI写得有问题?问题出在虚拟机那了。。在framework层加了自己的服务,这个服务应该调用了JNI吧,是不是有可能这个JNI 有点小问题?或者是这个服务 加的地方不对?在ServiceManager里面?
      

  8.   


    我的应用程序调用的是我自己写的服务也就是Usb3gService.java,这个类在/frameworks/base/service/java/com/seuic/server/JNI com_seuic_server_Usb3gService.cpp 在/frameworks/base/service/jni/目录下/frameworks/base/core/java/seuic/hardware目录下有IUsb3gService.aidl和Usb3gManager.java(服务的管理器,从SystemServer中得到服务:ServiceManager.getService("usb3g")))他们被编译成两个库,Jni被编译成.so库, 另外两个java类被编译成seuic.jar被上层应用调用Android.mk内容:LOCAL_PATH := $(call my-dir)# the library
    # =============================================================
    include $(CLEAR_VARS)LOCAL_SRC_FILES := \
                $(call all-subdir-java-files)LOCAL_MODULE_TAGS := engLOCAL_MODULE := seuic#
    #LOCAL_MODULE_CLASS := JAVA_LIBRARIES
    #LOCAL_JAVA_LIBRARIES := android.policy
    LOCAL_NO_STANDARD_LIBRARIES := true
    LOCAL_JAVA_LIBRARIES := core framework# AIDL
    LOCAL_SRC_FILES += \
    core/java/seuic/hardware/IUsb3gService.aidlinclude $(BUILD_JAVA_LIBRARY)# The JNI component
    include $(CLEAR_VARS)
    include $(call all-makefiles-under,$(LOCAL_PATH))
      

  9.   


    这个服务还没有加入到SystemManager里面就错了!
             
             Usb3gService us = new Usb3gService();//这里就挂了,根本还没有可能加入到ServiceManager中        try {
                ServiceManager.addService("usb3g", us);
            } catch (RuntimeException e) {
                Log.e("Usb3gSystemServer", "Start Usb3gService failed.");
            }
      

  10.   

    应该是你的jar包没有在CLASSPATH里你想办法怎么设上应该就好了。
      

  11.   

    楼主加完Service之后,编成的jar 应该是/system/framework/service.jar,这里面应该是一些java service的jar吧
    这个【jar文件在out/.../system/framework/*.jar】这个应该不对吧呵呵
      

  12.   


    大虾,您说的CLASSPATH在哪里啊?怎么设啊?
      

  13.   

    有个LOCAL_CLASSPATH在mk里,你可以试试看。
      

  14.   


    你看我的Android.mk文件内容,不可能被包在service.jar中吧,应该是一个新的jar文件。
      

  15.   


    我在Android.mk的官方spec里面没有看到你说的这个宏啊,奇怪
      

  16.   

    是的,我猜android只会用framework/service.jar来找里面的service类。因为如果你在外面也有个同名的jar,会导致不安全发生,android是无法区分的吧
      

  17.   

    我刚刚用oyq_yangy给我的LOCAL_CLASSPATH宏google了一下,发现一个鬼佬也有这个问题,但是别人的回答没看懂:http://stackoverflow.com/questions/2598293/adding-a-external-jar-reference-in-android-mk哪位大虾帮我看看
      

  18.   

    skygray兄,貌似我的做法是可以的,台湾有个jollen就是这么搞的
      

  19.   

    原来这样,我来学习下,要是我么,也不会费这么多事了,之间在service里搞搞就行了
      

  20.   

    你把调用jar的mk和manifest整上来看看。要不就是LOCAL_JAVA_LIBRARIES你设的不对。
    还有你可以先在命令行设置一下CLASSPATH,然后在命令行用am start起你的Activiy试试看看。
      

  21.   

    应用程序的Android.mkLOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)LOCAL_MODULE_TAGS := eng# Only compile source java files in this apk.
    LOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := Usb3gLOCAL_SDK_VERSION := current# Also link against our own custom library.
    LOCAL_JAVA_LIBRARIES := seuic framework
    # We need to assign platform key to use ServiceManager.addService.
    LOCAL_CERTIFICATE := platforminclude $(BUILD_PACKAGE)# Use the following include to make our test apk.
    include $(call all-makefiles-under,$(LOCAL_PATH))AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.seuic.usb3g">
        <application android:label="Usb Three G">
            <activity android:name="Usb3g">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
            <service android:name=".Usb3gSystemServer"
                      android:process=".Usb3gSystemServer" >
                <intent-filter>
                    <action android:name="com.seuic.systemserver"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                </intent-filter>
            </service>
        </application>
    </manifest>
      

  22.   

    你是用eclipse android工程调试的吗?manifest里要uses-library 你的jar包。
      

  23.   

    我没有用eclipse,用的是文本文件编辑的应用程序,在linux上编译的,跟编android系统的方法一样编的。manifest里要uses-library 你的jar包。指的是什么啊?
      

  24.   

    D/installd( 830): DexInv: --- BEGIN '/system/app/Usb3g.apk' ---
    D/dalvikvm( 1153): DexOpt: load 28ms, verify 29ms, opt 1ms
    D/installd( 830): DexInv: --- END '/system/app/Usb3g.apk' (success) ---
    W/dalvikvm( 1146): VFY: unable to find class referenced in signature (Lcom/seuic/server/Usb3gService;)
    E/dalvikvm( 1146): Could not find class 'com.seuic.server.Usb3gService', referenced from method com.seuic.usb3g.Usb3g$1.onClick
    W/dalvikvm( 1146): VFY: unable to resolve new-instance 17 (Lcom/seuic/server/Usb3gService;) in Lcom/seuic/usb3g/Usb3g$1;
    D/dalvikvm( 1146): VFY: replacing opcode 0x22 at 0x0018
    D/dalvikvm( 1146): Making a copy of Lcom/seuic/usb3g/Usb3g$1;.onClick code (84 bytes)
    I/ActivityManager( 903): Displayed activity com.seuic.usb3g/.Usb3g: 882 ms (total 882 ms)
    I/connect...( 1146): connect to 3g
    I/Usb3gTest( 1146): Creat a new Usb3gService object.楼主的log信息中怎么会有Usb3gService 这样的服务需要运行呢?这个系统是楼主修改过之后的系统吧?如果是标准的系统,能编译通过就应该可以运行起来的。
      

  25.   

    你的问题应该出在/system/etc/permission下面没有你的权限xml文件。看jollen的例子你就明白了。
      

  26.   

    怎么办呀,我也出现同样的问题。听有人说 manifest里要通过这句<uses-library android:name="我的jar包"/>要添加jar,我添加后还是一样,不知道是不是我添加错了,字符串“我的jar包”不知道该拿什么代替。