android studio NDK使用,编译c生成.so实践记录

开发环境,Android studio 2.1.2,SDK环境和NDK环境

SDK不说了,NDK环境配置网上也有很多,这里就简单记录下:

1 下载NDK并安装到电脑 D:\Android\android-ndk-r11c


2 android studio中右键项目进入菜单配置NDK



3 在项目的gradle.properties文件中加上 android.useDeprecatedNdk = true


为了方便生成头文件和so文件,我们可以在Android Studio → External Tools中设置两个命令,分别来生成头文件和生成.so文件





Program: $JDKPath$/bin/javah
Parameters: -encoding UTF-8 -d ../jni -jni $FileClass$
Working directory: $SourcepathEntry$\..\java





Program: D:\android\android-ndk-r11c\build\ndk-build.cmd
Parameters: NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs
Working directory: $ModuleFileDir$\src\main
(注意:NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs
这个含义是将生成的so文件放在jniLibs这个文件下,
如果不写这句话,什么都不填,则为默认的文件夹)





写一个测试类



右击这个类选择刚才写的javac命令,就会生成头文件



根据头文件写一个测试的.c文件

注意:打红框的地方要和头文件的名称和方法命名一样

写一个Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := TestJni.c
include $(BUILD_SHARED_LIBRARY)


然后右击jni文件夹选择我们的命令ndk-build





则生成了





build.gradle的配置




最后so已经生成,调用


android.useDeprecatedNdk=true

最后加上一句
Android Studio正确添加so库的两种方式

以下两种方式二选一

方法一:

1.在src/main中新建jniLibs文件夹 ,把.so复制进去即可

方法二:

1.在app/中新建libs文件夹,把.so复制进去

2.在build.gradle中添加以下五行脚本即可(注:以下脚本意思是会把libs文件夹当成jniLibs文件夹,可以直接用so库了)

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

贴上完整的build.gradle文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.tofu.chat"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

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

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile project(':common')
    compile files('libs/kandy-1.6.244.jar')
}


//这里是指定so的路径,如果是正规点的路径jniLibs就不用写sourceSetsle .
//现在so的路径是在jniLibs_test这个目录所以要指定一下
sourceSets{
main{
jni.srcDir "src/main/jni"
jniLibs.srcDir "src/main/jniLibs_test"
}
}
//这里是指定libs的so路径,一般不用写,下面这句会自动去找libs里面的文件
// compile fileTree(dir: 'libs', include: ['*.jar'])
/* sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值