编译流程:
1、预处理
2、编译
3、汇编
4、连接
gcc -o test test.c
直接把test.c文件 编译成 可执行文件
静态库
rcs
r:表示更新、增加新文件到静态库中
c:创建一个库,不管存在与否,都创建
s:创建文档索引,在创建较大的库的时候,能够加快编译时间。
动态库
生成静态库命令:
ar rcs libtool.a tool.o
生成动态库命令:
gcc -shared -fPIC -o libtool.so tool.o
什么是makefile?
Android.mk 介绍
上代码
第一步
:创建c文件
#include <jni.h>
int test() {
return 123;
}
//com.example.ndk616
//返回值int 类型 所以 jint
// Java 大写开头 用下划线拼接 包名_类名_方法名
jint Java_com_example_ndk616_MainActivity_nativeTest() {
return test();
}
第二步:
创建Android.mk文件
#定义模块当前路径
LOCAL_PATH := $(call my-dir)
#清空当前环境变量
include $(CLEAR_VARS)
#当前模块名
LOCAL_MODULE := hello-jni
#当前模块包含的源代码文件
LOCAL_SRC_FILES := hello-jni.c
#生成一个动态库
include $(BUILD_SHARED_LIBRARY)
第三步
app buildgradle
android {
compileSdkVersion 28
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.ndk616"
minSdkVersion 27
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//指定源文件的编译方式,以及配置编译选项
externalNativeBuild{
ndkBuild{
//指定cpu架构 我用的模拟器
abiFilters "x86"
}
}
}
//配置native的编译脚本路径
externalNativeBuild {
ndkBuild{
path "src/main/ndkBuild/Android.mk"
}
}
编译之后 可以在build文件夹下 apk文件里看到.so文件
第四步
android代码中加载本地库
public class MainActivity extends AppCompatActivity {
{
System.loadLibrary("hello-jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText("nativeTest() = " + nativeTest());
}
//定义本地方法
native int nativeTest();
}