0

我正在编写一个 Android API 级别 10 应用程序,它捕获视频,然后将它们上传到我们的 Kaltura 站点。这应该是直截了当的,因为 Kaltura 提供了一个 Java 客户端库(此处),并且他们在名为“Kaltura Android SDK 参考应用程序实施指南”的文档中说要使用 Java 客户端库。(这里

好吧,在编写了与 Java 客户端库示例相同的初步 Kaltura 上传类之后,Kaltura 显示(在第一个链接上)包括我项目的 Java 客户端库“libs”文件夹中包含的所有构建引用,JUnit 除外因为 Android 已经拥有自己的 JUnit(包括它们的 JUnit 导致构建失败),所以应用程序在构建新的 KalturaClient 对象期间抛出 java.lang.VerifyError:

W/dalvikvm(8232): VFY: array-length on non-array
W/dalvikvm(8232): VFY:  rejecting opcode 0x21 at 0x000a
W/dalvikvm(8232): VFY:  rejected Lorg/apache/log4j/config/PropertySetter;.getPropertyDescriptor (Ljava/lang/String;)Ljava/beans/PropertyDescriptor;
W/dalvikvm(8232): Verifier rejected class Lorg/apache/log4j/config/PropertySetter;
W/dalvikvm(8232): Exception Ljava/lang/VerifyError; thrown while initializing Lorg/apache/log4j/LogManager;
W/dalvikvm(8232): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Lcom/kaltura/client/KalturaClientBase;
D/AndroidRuntime(8232): Shutting down VM
W/dalvikvm(8232): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(8232): FATAL EXCEPTION: main
E/AndroidRuntime(8232): java.lang.ExceptionInInitializerError
E/AndroidRuntime(8232):     at com.mysite.myapp.kaltura.KalturaUploader.<init>(KalturaUploader.java:32)
E/AndroidRuntime(8232):     at com.mysite.myapp.storage.LoginActivity.invokeKaltura(LoginActivity.java:105)
E/AndroidRuntime(8232):     at com.mysite.myapp.storage.LoginActivity.access$2(LoginActivity.java:102)
E/AndroidRuntime(8232):     at com.mysite.myapp.storage.LoginActivity$3.onClick(LoginActivity.java:81)
E/AndroidRuntime(8232):     at android.view.View.performClick(View.java:2506)
E/AndroidRuntime(8232):     at android.view.View$PerformClick.run(View.java:9112)
E/AndroidRuntime(8232):     at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(8232):     at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(8232):     at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(8232):     at android.app.ActivityThread.main(ActivityThread.java:3835)
E/AndroidRuntime(8232):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(8232):     at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(8232):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
E/AndroidRuntime(8232):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
E/AndroidRuntime(8232):     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(8232): Caused by: java.lang.ExceptionInInitializerError
E/AndroidRuntime(8232):     at org.apache.log4j.Logger.getLogger(Logger.java:118)
E/AndroidRuntime(8232):     at com.kaltura.client.KalturaClientBase.<clinit>(KalturaClientBase.java:45)
E/AndroidRuntime(8232):     ... 15 more
E/AndroidRuntime(8232): Caused by: java.lang.VerifyError: org.apache.log4j.config.PropertySetter
E/AndroidRuntime(8232):     at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:684)
E/AndroidRuntime(8232):     at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:647)
E/AndroidRuntime(8232):     at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:544)
E/AndroidRuntime(8232):     at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:440)
E/AndroidRuntime(8232):     at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:476)
E/AndroidRuntime(8232):     at     org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:471)
E/AndroidRuntime(8232):     at org.apache.log4j.LogManager.<clinit>(LogManager.java:125)
E/AndroidRuntime(8232):     ... 17 more
I/Process(8232): Sending signal. PID: 8232 SIG: 9

所以我猜发生上述情况是因为如果没有额外的包装类 (code.google.com/p/android-logging-log4j),Log4J 不能完全在 Android 上运行,那么为什么不直接修改 Kaltura 以使用 Android 的日志记录工具呢?

因为我读过(在 Kaltura 的文档中)Java 客户端不是编写的而是生成的,所以我觉得手动编辑代码以支持 android-logging-log4j 会很天真。此外,当我在 Eclipse 中打开 Kaltura Java Client 源代码时,我的构建路径中缺少一些类。我注意到的第一个是 sun.misc.BASE64Encoder...Android 确实有它自己的 Base64Encoder,它可以兼容吗?

有人对我应该做什么有任何建议吗?有人在 Android 上运行 Kaltura Java 客户端库吗?第二个链接中描述的示例应用程序在哪里?

附带说明一下,当我构建项目时,我还在 Eclipse 控制台中看到了许多这些消息,包括在我的构建路径中提供的 JAR:

[2012-07-18 22:44:37 - MyApp] Dx warning: Ignoring InnerClasses attribute for an anonymous inner class
(org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory$1) that doesn't come with an
associated EnclosingMethod attribute. This class was probably produced by a
compiler that did not target the modern .class file format. The recommended
solution is to recompile the class from source, using an up-to-date compiler
and without specifying any "-target" type options. The consequence of ignoring
this warning is that reflective operations on this class will incorrectly
indicate that it is *not* an inner class.

在此先感谢您的帮助!


编辑:浏览 Kaltura 代码,我发现了一些可怕的东西,这一定是这个生成的库的结果......

// ===================================================================================================
//                           _  __     _ _
//                          | |/ /__ _| | |_ _  _ _ _ __ _
//                          | ' </ _` | |  _| || | '_/ _` |
//                          |_|\_\__,_|_|\__|\_,_|_| \__,_| 
//
// This file is part of the Kaltura Collaborative Media Suite which allows users
// to do with audio, video, and animation what Wiki platfroms allow them to do with
// text.
//
// Copyright (C) 2006-2011  Kaltura Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// @ignore
// ===================================================================================================
package com.kaltura.client.enums;

/**
 * This class was generated using generate.php
 * against an XML schema provided by Kaltura.
 * @date Wed, 18 Jul 12 07:10:33 -0400
 * 
 * MANUAL CHANGES TO THIS CLASS WILL BE OVERWRITTEN.
 */
public enum KalturaFlavorReadyBehaviorType implements KalturaEnumAsInt {
    NO_IMPACT (0),
    REQUIRED (1),
    OPTIONAL (2),
    INHERIT_FLAVOR_PARAMS (0);

    public int hashCode;

    KalturaFlavorReadyBehaviorType(int hashCode) {
         this.hashCode = hashCode;
    }

    public int getHashCode() {
        return this.hashCode;
    }

    public static KalturaFlavorReadyBehaviorType get(int hashCode) {
        switch(hashCode) {
            case 0: return NO_IMPACT;
            case 1: return REQUIRED;
            case 2: return OPTIONAL;
            case 0: return INHERIT_FLAVOR_PARAMS;
            default: return NO_IMPACT;
        }
    }
}

他们是如何编译这段代码的?它甚至不是合法的Java。可能有一百个类,其中大多数在顶部都有“这是自动生成的”通知。其他类也有类似的愚蠢问题(KalturaNullableBoolean)。

现在我将假设 Java 客户端库不存在。存在一个 Ruby 客户端库,过去我在 Android 上使用 JRuby 取得了巨大成功,我们的应用程序只上传大文件,无论如何都需要很长时间,所以开销增加不应该非常明显..如果这一切作品。由于包含的 JRuby JAR,我们只需要接受巨大的 .APK...

更不用说他们把所有东西都塞进了 2 个 Ruby 脚本而不是数百个 Java 类……如果有的话,去掉不兼容的功能就更容易了,至少我的 Eclipse 项目不会是 Kaltura Java 源文件的丛林了。:D

谢谢阅读。

4

1 回答 1

0

客户端确实是自动生成的,随着 Kaltura 的 API 得到更新,服务器每次更新都会生成新的客户端,以提供客户端中的最新功能。您可以在此处阅读有关 Kaltura 客户端库生成器的更多信息:http: //knowledge.kaltura.com/adding-new-kaltura-api-client-library-generator

欢迎您认为可以改进客户端库的任何补丁或修改,请随时将其附加到此处或 Kaltura.org 上的问题线程中。

当前的 Java 客户端还不是 Android 友好的,它适合纯 Java 使用。有工作来适应和创建一个 Android 特定版本,非常感谢任何改进的建议或补丁。

于 2012-07-22T22:55:36.870 回答