繁体   English   中英

集成外部纯Java库并对其进行Android类访问

[英]Integrating an external pure Java library and having Android classes access on it

我在尝试获取外部Java项目时遇到了麻烦,因此我也可以在其上使用Android类。 该库已集成在Android项目中。 例如:我有几个模型类,我想要实现Parcelable因此可以相应地进行串行化,但是没有一个Android类可用。

澄清我只是为了试图解决这个问题而这样做

到目前为止我只尝试过:

  • 更改和匹配外部库的包:

Android中的包名称

com.domain.androidproject

图书馆的包最初

com.domain.libproject

变成:

com.dommain.androidproject.libproject

但到目前为止没有运气。 我将库导入为Gradle外部项目vía:

compile project(path: ':LibProject')

谢谢您的帮助。

你必须在纯Java库和android之间定义一个绑定。 您可以使用依赖注入来使用类签名注入模型,然后在应用程序内部(或插入另一个项目,如插件)中定义parcelable模型。 或者你可以使用泛型来实现相同的功能。 请记住,因为java库已经编译,从技术上讲,你不能通过将它导入android项目来改变它(我看到人们从一个依赖项“重写”一些文件,然后用整个原始路径添加它们欺骗类路径,但这是非常危险的,因为你不能与依赖的代码的其余部分进行交互,如果有什么变化,事情就会破坏)。

如果您可以访问纯java的库源代码,则将其修改为使用工厂或模型提供者。 如果没有,请扩展模型,添加parcelable支持,并尝试使用它们而不是原始模型类。

例:

让我们假设我们有一个模型和一些使用它的函数:

public class myModel{

    private int id;
    private String name;

    public void setId(int id){
        this.id = id;
    }

    //more getters and setters
}

public interface myModelCreator<T>{
    public myModel create(T toModel);
    public T uncreate(myModel fromModel);
}

public static void doSomething(myModel model){
    //some library operations
}

现在,在android项目中:

public class myAndroidModel extends myModel implements Parcelable{
    /*Implements the parcelable methods using the class accessors, or you can change the myModel members to protected.*/
}

public class myAndroidModelCreator implements myModelCreator<myAndroidModel>{

    @Override
    public myModel create(myAndroidModel toModel){
        //create the myModel using the parcelable class.
    }

    @Override    
    public myAndroidModel uncreate(myModel fromModel){
        //reverse operation.
    }

}

现在,在android项目中,您可以在任何地方使用parcelable子类,并且每次需要调用库时,您都可以使用parcelables作为参数提供创建者接口。 另一种方法是将库方法签名更改为以下内容:

public static void<T extends myModel> doSomething(T model){
    //some library operations
}

所以你可以直接使用parcelable子类。 但是,根据您的层次结构,这可能是不可能的。 最后,您可以尝试使用Android项目中的Guice和Roboguice在java项目中实现依赖注入。 由于roboguice使用guice,它们可以互操作,但这是一个很长的镜头。

我喜欢Fco P.的回答,但为了完整性,这里有一个替代答案。

使用json序列化对象,而不是Parcelable 然后,您可以将序列化的json作为一个额外的意图字符串或捆绑包中的字符串。

通常,如果您想在另一个项目/库中使用类:

文件 - >新建 - >导入模块 - >导航到旧项目/库的目录 - >确定

选中要导入的模块 - >确定

右键单击应用程序模块 - >打开模块设置 - >依赖项 - > + - >模块 - >新模块。

然后,您的项目应该可用于您刚刚执行的任何项目。

使用packagename com.domain.libproject创建一个android库项目

复制src文件夹中的所有源。

更新build.gradle中的jar依赖项,之后您可以使库中的类可以进行parcelable。

如果有任何问题,请告诉我。

最好的regds

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM