在 Android Studio 中使用预建库
Using Prebuilt library in Android Studio
我正在 android 中创建一个 jni 函数以使用 BoringSSL 生成文件校验和。
所以我构建了 boringssl 到共享库,以便在 Android studio 中使用预构建库。
这样的构建输出。
我将 *.so 文件复制到我的项目中 src/main/jniLibs/lib
和 BoringSSL 将文件夹包含到 src/main/jni
我引用了这个项目并应用到我的项目中。
https://github.com/googlesamples/android-ndk/tree/master/hello-libs
我的build.gradle文件是这样的。
我正在使用 gradle-experimental:0.7.0( 和 Window10, Android Studio 2.1.2 )
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
boringssl {
headers.srcDir "src/main/jni/include/openssl"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jniLibs/lib/libcrypto.so")
sharedLibraryFile = file("src/main/jniLibs/lib/libssl.so")
}
}
}
}
android {
compileSdkVersion = 24
buildToolsVersion = '24.0.1'
defaultConfig {
applicationId = 'yein.a'
minSdkVersion.apiLevel = 19
targetSdkVersion.apiLevel = 24
versionCode = 1
versionName = '1.0'
}
ndk {
moduleName = 'hello-libs'
ldLibs.addAll(['android', 'log'])
}
sources {
main {
jni {
dependencies {
library 'boringssl' linkage 'shared'
}
}
jniLibs{
source{
srcDir "src/main/jniLibs/lib"
}
}
}
}
productFlavors{
create("arm"){
ndk.abiFilters.add("armeabi-v7a")
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.1.1'
}
这是我的项目结构。
我想我正确地应用了示例项目,因为它没有发生gradle同步错误。
并且当我使用 MD5 函数时 Android Studio 会像这样自动完成函数名称。
但是我点击运行却出现了这样的错误...
我在google,github中搜索了很多项目,当然还有Whosebug以前的答案,但我仍然没有解决我的问题。
我尝试更改 gradle 版本,但其他 gradle 版本在自动生成的 jni 函数中发生错误,除了 gradle-experimental:0.7.0.
谁能指出正确的方向或解决方案?
感谢阅读我的问题。
你可以尝试从 JNI 调用 java API,有一个很好的教程 here, Google recommends on this site 你应该调用 java API 或者你可以 link 图书馆吗?
如果您不能或不想调用 java API,您始终可以使用 CRC32 而不是 MD5,CRC32 使用 libz 库并且该库已经在 NDK 中文件。 C 中的 CRC32
#include <zlib.h>
int checkSumCRC32(char *text){
long n = crc32(0, (const void*)text, strlen(text));
printf("CRC32 %d", n);
return n;
}
记得将 ldLibs.addAll(['z'])
添加到您的 Gradle 文件
如果您需要 MD5 和 BoringSSL,这是我的 gradle.build BoringSSL 文件。
注意:我正在使用您在 ubuntu、libssl.a、libcrypto.a 和 libdecrepit.a
上编译的 3 个库
注2:I am using com.android.tools.build:gradle-experimental:0.7.0-alpha4
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
libcrypto {
headers.srcDir "./main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/crypto/libcrypto.a")
}
}
libssl {
headers.srcDir "./main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/ssl/libssl.a")
}
}
libdecrepit {
headers.srcDir "src/main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/decrepit/libdecrepit.a")
}
}
}
}
android {
compileSdkVersion = 23
buildToolsVersion = "22.0.1"
defaultConfig {
applicationId = "net.app"
minSdkVersion.apiLevel = 9
targetSdkVersion.apiLevel = 23
versionCode = 1
}
ndk {
platformVersion = 21
moduleName = "modulename"
toolchain = "clang"
abiFilters.addAll([ 'armeabi-v7a'])
CFlags.addAll(["-fvisibility=hidden", "-fpic"])
ldLibs.addAll(['log', 'z', 'android']) //Libreria llog, lz y landroid
}
sources {
main {
jni{
dependencies {
library "libcrypto" linkage "static"
library "libssl" linkage "static"
library "libdecrepit" linkage "static"
}
}
}
}
}
}
我没有使用过 MD5,但我使用过 boringSSL 的 SHA256,而且效果很好。您也可以将它用作校验和方法。这是我的 SHA256 方法。
char *sha256(char *str){
unsigned char hash[SHA256_DIGEST_LENGTH];
char *output = (char *) malloc(sizeof(char)*((SHA256_DIGEST_LENGTH*2)+1));
if (output == NULL) {
return NULL;
}
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str, strlen(str));
SHA256_Final(hash, &sha256);
int i;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++){
sprintf(&output[i*2], "%02x", (unsigned int)hash[i]);
}
return output;
}
我正在 android 中创建一个 jni 函数以使用 BoringSSL 生成文件校验和。
所以我构建了 boringssl 到共享库,以便在 Android studio 中使用预构建库。
这样的构建输出。
我将 *.so 文件复制到我的项目中 src/main/jniLibs/lib 和 BoringSSL 将文件夹包含到 src/main/jni
我引用了这个项目并应用到我的项目中。
https://github.com/googlesamples/android-ndk/tree/master/hello-libs
我的build.gradle文件是这样的。 我正在使用 gradle-experimental:0.7.0( 和 Window10, Android Studio 2.1.2 )
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
boringssl {
headers.srcDir "src/main/jni/include/openssl"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jniLibs/lib/libcrypto.so")
sharedLibraryFile = file("src/main/jniLibs/lib/libssl.so")
}
}
}
}
android {
compileSdkVersion = 24
buildToolsVersion = '24.0.1'
defaultConfig {
applicationId = 'yein.a'
minSdkVersion.apiLevel = 19
targetSdkVersion.apiLevel = 24
versionCode = 1
versionName = '1.0'
}
ndk {
moduleName = 'hello-libs'
ldLibs.addAll(['android', 'log'])
}
sources {
main {
jni {
dependencies {
library 'boringssl' linkage 'shared'
}
}
jniLibs{
source{
srcDir "src/main/jniLibs/lib"
}
}
}
}
productFlavors{
create("arm"){
ndk.abiFilters.add("armeabi-v7a")
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.1.1'
}
这是我的项目结构。
我想我正确地应用了示例项目,因为它没有发生gradle同步错误。
并且当我使用 MD5 函数时 Android Studio 会像这样自动完成函数名称。
但是我点击运行却出现了这样的错误...
我在google,github中搜索了很多项目,当然还有Whosebug以前的答案,但我仍然没有解决我的问题。
我尝试更改 gradle 版本,但其他 gradle 版本在自动生成的 jni 函数中发生错误,除了 gradle-experimental:0.7.0.
谁能指出正确的方向或解决方案?
感谢阅读我的问题。
你可以尝试从 JNI 调用 java API,有一个很好的教程 here, Google recommends on this site 你应该调用 java API 或者你可以 link 图书馆吗?
如果您不能或不想调用 java API,您始终可以使用 CRC32 而不是 MD5,CRC32 使用 libz 库并且该库已经在 NDK 中文件。 C 中的 CRC32
#include <zlib.h>
int checkSumCRC32(char *text){
long n = crc32(0, (const void*)text, strlen(text));
printf("CRC32 %d", n);
return n;
}
记得将 ldLibs.addAll(['z'])
添加到您的 Gradle 文件
如果您需要 MD5 和 BoringSSL,这是我的 gradle.build BoringSSL 文件。
注意:我正在使用您在 ubuntu、libssl.a、libcrypto.a 和 libdecrepit.a
上编译的 3 个库注2:I am using com.android.tools.build:gradle-experimental:0.7.0-alpha4
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
libcrypto {
headers.srcDir "./main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/crypto/libcrypto.a")
}
}
libssl {
headers.srcDir "./main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/ssl/libssl.a")
}
}
libdecrepit {
headers.srcDir "src/main/jni/include/openssl"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/${targetPlatform.getName()}/decrepit/libdecrepit.a")
}
}
}
}
android {
compileSdkVersion = 23
buildToolsVersion = "22.0.1"
defaultConfig {
applicationId = "net.app"
minSdkVersion.apiLevel = 9
targetSdkVersion.apiLevel = 23
versionCode = 1
}
ndk {
platformVersion = 21
moduleName = "modulename"
toolchain = "clang"
abiFilters.addAll([ 'armeabi-v7a'])
CFlags.addAll(["-fvisibility=hidden", "-fpic"])
ldLibs.addAll(['log', 'z', 'android']) //Libreria llog, lz y landroid
}
sources {
main {
jni{
dependencies {
library "libcrypto" linkage "static"
library "libssl" linkage "static"
library "libdecrepit" linkage "static"
}
}
}
}
}
}
我没有使用过 MD5,但我使用过 boringSSL 的 SHA256,而且效果很好。您也可以将它用作校验和方法。这是我的 SHA256 方法。
char *sha256(char *str){
unsigned char hash[SHA256_DIGEST_LENGTH];
char *output = (char *) malloc(sizeof(char)*((SHA256_DIGEST_LENGTH*2)+1));
if (output == NULL) {
return NULL;
}
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str, strlen(str));
SHA256_Final(hash, &sha256);
int i;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++){
sprintf(&output[i*2], "%02x", (unsigned int)hash[i]);
}
return output;
}