如何使用gradle 0.7+将.so文件添加到android库项目中

时间:2014-01-21 10:13:53

标签: android android-ndk android-gradle

项目结构:

应用项目 - >取决于图书馆项目

图书馆计划 有一个已编译的jni库的文件夹

jniLibs.srcDirs = ['libs']

我已经尝试按照示例app https://android.googlesource.com/platform/tools/build/+/2e1f7810edd76d92cee8d3e06bc4dec0c288adea/tests/ndkSanAngeles/build.gradle将以下内容添加到build.gradle的android元素中,但是android库项目不支持productFlavours,因此汇编失败并显示“找不到方法” productFlavors()用于项目“

上的参数[dghdhd]
productFlavors {
    x86 {
        ndk {
            abiFilter "x86"
        }
    }
    arm {
        ndk {
            abiFilters "armeabi-v7a", "armeabi"
        }
    }
}

有没有办法为Android库项目添加ndk支持?

4 个答案:

答案 0 :(得分:63)

最后我不需要使用产品口味。

对于图书馆项目,我添加了以下内容:

android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }        
}

libs文件夹里面有一个名为“armeabi-v7a”的文件夹,因为这是我唯一的目标,所以它有效。

将ndk文件(.so)传播到使用android库项目的android项目中。

答案 1 :(得分:11)

android experimental gradle plugin的示例。

要求:

  • Android Studio 1.5 +
  • gradle这个-2.10
  • gradle这个实验性:0.6.0-素α5

1)默认情况下,您可以将所有共享本机库放在 main / jniLibs 文件夹中。

项目结构

根文件夹/ android项目

根文件夹/ android_project / app / src / main / jniLibs / x86

根文件夹/ android_project / app / src / main / jniLibs / armeabi-v7a

根文件夹/ android_project / app / src / main / jniLibs / ...

Gradle会自动将它们上传到设备。

然后您可以在应用程序中加载库。

static {
    System.loadLibrary("mylibrary");
}

2)您还可以将所有共享本机库放在自定义位置。

带有 bin / android / Debug 目录路径的示例。

在这种情况下,您应该在 build.gradle 文件中手动设置库位置。

项目结构

根文件夹/ android项目

根文件夹/ bin / android / Debug / jniLibs / x86

root文件夹/ bin / android / Debug / jniLibs / armeabi-v7a

root folder / bin / android / Debug / jniLibs / ...

根文件夹/ android_project / app / build.gradle

apply plugin: 'com.android.model.application'

model {
    android {
        sources {
            main {
                jni {
                    source {
                        srcDirs = []
                    }
                }

                jniLibs {
                    source {
                        srcDirs "/../../bin/android/Debug/jniLibs"
                    }
                }
            }
        }
    }
}

答案 2 :(得分:0)

根据这个帖子:

https://groups.google.com/forum/#!topic/adt-dev/nQobKd2Gl_8

无法将.so文件添加到库项目中是一个在插件的v0.8中修复的错误。

答案 3 :(得分:0)

我正在使用Android Studio 2.1,我发现在我的build.gradle中添加sources或sourceSets条目没有明显的效果。相反,我发现我需要以下内容:

public class Example {

    public static void main(String[] args) {
        ItemStore store;
        Monitor monitor;
        Mouse mouse;

        store = new ItemStore();
        monitor = new Monitor();
        monitor.id = 2;
        monitor.price = 6;

        mouse = new Mouse();
        mouse.id = 7;
        mouse.buttons = 3;

        store.addItem(monitor);
        store.addItem(mouse);

        System.out.println(store.getItem(2).price);   // = 6
        System.out.println(((Monitor) store.getItem(2)).dpi);
        System.out.println(((Mouse) store.getItem(7)).buttons); //Downcasting ... = 3
    }
    public static class Item {
       String id;
       String description;
       int price;
       // common attributes here!
    }

    public static class Monitor extends Item {
        private int dpi;
       // monitor particular atributes here!!
    }

    public static class Mouse extends Item {
        private int buttons;
        // mouse particular attributes here!!!
    }


    public static class ItemStore {
       private Hashtable<String, Item> table = new HashTable<>();

       public boolean addItem(Item item) {
           this.table.put(item.getId(), item);
       }

       public Item getItem(String id) {
           return this.table.get(id);
       }
    }
}