说下我的AndroidStudio版本是2.3.3, 还没有更新到3.x(手动委屈), 主要还是想把手头项目搞定了再跳坑. 然后这次添加了mac平台的配置, 其实没多大区别, 当然, linux也是大同小异, 毕竟android studio是通用的. 为什么要使用.so?从我自己的理解出发, 有几点非常主要:
有个比较头痛的事情叫做配环境
mac下下载ndk
win下下载ndk
mac下配置ndk路径
win下配置ndk路径
vim .bash_profile
mac下添加ndk路径
更新配置文件并测试ndk-build指令
更新配置并测试
win下配置ndk环境变量
加入到PATH大家庭
打开PowerShell测试一下
打开PowerShell测试一下
终于可以开始使用NDK了, 或者你可以管它叫JNI
mac下
win下
public class HelloJNI {
//一个加法函数, 用c实现
public native int AddC (int a, int b);
static {
//加载库, 注意库名的一致性
System.loadLibrary("HelloC");
}
}
使用javah命令生成头文件, 注意! 这是重点, 要背!(滑稽脸)然后新建一个同名c/cpp.
mac下生成头文件
生成后目录一栏
生成后目录一栏
使用javah命令生成头文件
一览
/*
* Class: com_so_myapplication_HelloJNI
* Method: AddC
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_so_myapplication_HelloJNI_AddC
(JNIEnv *, jobject, jint, jint);
#include "com_so_myapplication_HelloJNI.h"
JNIEXPORT jint JNICALL Java_com_so_myapplication_HelloJNI_AddC
(JNIEnv * env, jobject obj, jint a, jint b){
return a + b;
}
在jni目录下创建Android.mk和Application.mk文件并写入内容, 重点! Android.mk内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloC
LOCAL_SRC_FILES := com_so_myapplication_HelloJNI.c
LOCAL_SRC_FILES += util.c
include $(BUILD_SHARED_LIBRARY)
有2个要点:
System.loadLibrary("HelloC");
中的名称一致;util.c
文件进行编译, 否则会报错, 不信可以试试(手动滑稽), mac/linux下无需.
Application.mk内容如下:APP_ABI := all
#APP_ABI := armeabi armeabi-v7a x86 mips arm64-v8a mips64 x86_64
有2个要点:
配置build.gradle, 重中之重! 先是build.gradle一览:
android {
compileSdkVersion 26
buildToolsVersion "26.0.3"
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
defaultConfig {
applicationId "com.so.myapplication"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
moduleName "HelloC" //System.loadLibrary("HelloC");
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
ndk需要配置, 注意名字匹配!
ndk {
moduleName "HelloC" //System.loadLibrary("HelloC");
}
sourceSets配置
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
在gradle.properties中加上一句
android.useDeprecatedNdk=true
然后就是ndk-build了, 再查看是否生成成功!
mac下ndk-build
win下ndk-build
一览
你可以在这个项目中使用这个由c实现的加法函数了, 但是我们有更酷的事情要做, 那就是在另外的项目中用这个函数.
这件事其实没有很难, 基本靠两步. 第一步就是将前一个项目生成的libs目录下的全部内容拷贝到AndroidStudio自带的libs目录下
一览
第二步就是创建一个和前一个生成libs目录的项目相同的包和类, 类中写入的内容也是一样的.顺带加下build.gradle中的sourceSets, 不记得位置, 参考之前的build.gradle一览.
一览
public class HelloJNI {
public native int AddC (int a, int b);
static {
System.loadLibrary("HelloC");
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
最后测试下效果, 这段代码我就不解释了, 这看不懂也就告别手表了!
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv_testc = (TextView) findViewById(R.id.tv_testc);
tv_testc.setText("add: " + new HelloJNI().AddC(1, 2));
}
}
测试结果
完结散花! 喜欢记得点赞或者关注我哦, 有问题和意见可以评论区~~