把以前自己的笔记整理一下,记录自己创建so文件的过程
环境:
Android studio 3.6
jdk 1.8
android-ndk-r10e
1.创建前先创建两个快捷工具,File->Setting->Tools->External Tools添加两个:
program分别是javah和ndk-build的路径
2.创建一个java文件:
public class Jni {
static {
System.loadLibrary("Jni");//lib名,对应创建的java文件名
}
public static native String getString();
}
3.在MainActivity中调用:
public class MainActivityextends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
tv.setText(Jni.getString());
}
}
4.右键java文件,使用javah快捷工具
若有编码GBK的不可映射字符,则javah工具改为:
5.在src/main新建一个jni文件夹,新建Jni.c,把.h里面的内容复制进去,并实现里面的函数
JNIEXPORT jstring JNICALL Java_com_snow_myapplication_Jni_getString
(JNIEnv *env, jclass js){
return (*env)->NewStringUTF(env,"耶");
}
6.在jni文件下添加Android.mk和Application.mk
Android.mk:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=Jni
LOCAL_SRC_FILES =: Jni.c
include $(BUILD_SHARED_LIBRARY)
Application.mk:
APP_MODULES :=Jni
APP_ABI := all # 生成所有的版本
7.打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码 注意这里的moduleName,是在之前自己编写的类里面加载的so库名.(放在defaultConfig)
ndk{
moduleName"Jni"
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir"src/main/libs"
}
8.右键jni文件夹使用ndk-build工具
在libs文件下生成了so文件:
9.运行成功
Conflict with dependency 'com.android.support:support-annotations' in project ':app'. Resolved versions for app (26.1.0) and test app (27.1.1) differ. See https://d.android.com/r/tools/test-apk-dependency-conflicts.htmlfor details.
configurations.all { resolutionStrategy.force 'com.android.support:support-annotations:27.1.1' }