如何在Gradle中设置NDK库路径? [英] How to setup NDK libs path in Gradle?

查看:519
本文介绍了如何在Gradle中设置NDK库路径?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个项目 A B

A 是主要项目,使用 B 思想依赖关系 A-> B



位于两个项目中的NDK库: p>

  -------------- -------------- 
| A | | B |
-------------- --------------
| JNI库| | JNI库|
-------------- --------------


A
| -jniLibs
| -armeabi-v7a
| -x86

B
| -jniLibs
| -armeabi-v7a
| -x86

我尝试在两个项目中包含JNI:

从A开始build.gradle:

  ... 
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['jniLibs']
}

}

splits {
abi {
enable true
reset()
include'x86','armeabi-v7a'
universalApk true
}
}

productFlavors {

x86 {
ndk {
abiFiltersx86,
}
}

arm7 {
ndk {
abiFiltersarmeabi-v7a,
}
}


...



一块build.gradle从B:

  ... 
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['jniLibs']
}

}

split {
abi {
enable true
reset()
include'x86','armeabi-v7a','mips'
universalApk true
}
}

productFlavors {

x86 {
ndk {
abiFiltersx86,
}
}

arm7 {
ndk {
abiFiltersarmeabi-v7a,
}
}

}
...

当我尝试启动我的应用程序时,出现了有关从JNI lib中缺少方法实现的错误。你可以说jni lib不包含这个方法,但是如果我把所有的 .so 文件放到一个项目中,并尝试使用B项目中的lib - 我没有有什么错误。

所以问题是:如何直接在gradle中定位JNI lib路径?

解决方案

最后我解决了我的问题。 仔细阅读



这个错误出现在与JNI一起工作的Java类路径中。

没有gra鱼的错误。错误在包名中。我将包含本地方法的类移动到另一个包中。



当您更改包含本机方法的包的包名称(移动包)时,您应该更改方法签名码。如果您无法更改本机代码,则应该为该课程保留包名。


I have two projects A and B.

A is a main project, that use B thought dependency A->B

NDK libs located in two projects :

--------------    --------------
|      A      |   |     B      | 
--------------    --------------
|  JNI libs   |   |  JNI libs  |
--------------    --------------


A
|-jniLibs
     |-armeabi-v7a
     |-x86

B
|-jniLibs
     |-armeabi-v7a
     |-x86

And I try to include JNI into both projects :

Piece of build.gradle from A :

 ...
 sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['jniLibs']
        }

    }

    splits {
        abi {
            enable true
            reset()
            include 'x86', 'armeabi-v7a'
            universalApk true
        }
    }

    productFlavors {

        x86 {
            ndk {
                abiFilters "x86", ""
            }
        }

        arm7 {
            ndk {
                abiFilters "armeabi-v7a", ""
            }
        }

    }
    ...

Piece of build.gradle from B :

 ...
 sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['jniLibs']
        }

    }

    splits {
        abi {
            enable true
            reset()
            include 'x86', 'armeabi-v7a', 'mips'
            universalApk true
        }
    }

    productFlavors {

        x86 {
            ndk {
                abiFilters "x86", ""
            }
        }

        arm7 {
            ndk {
                abiFilters "armeabi-v7a", ""
            }
        }

    }
    ...

And when I try to launch my App I've got an error about missing implementation of method from JNI lib. You can say that jni lib doesn't contains the method, but if I put all .so files to A project and try use the lib from B project - I doesn't have any error.

So the question is : how to locate directly JNI lib path in gradle?

解决方案

Finally I solved my problem. Read attentively.

The mistake was in path of Java class that worked with JNI.

There is no gradle mistakes. Mistake was in package name. I move my class that contains native methods to another package.

When you change package name(move package) for class that contains native methods, you should change method signature in native code. If you doesn't have ability to change native code you should keep package name for this class.

这篇关于如何在Gradle中设置NDK库路径?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆