把以前自己的笔记整理一下,记录自己创建so文件的过程

环境:

Android studio 3.6

jdk 1.8

android-ndk-r10e

1.创建前先创建两个快捷工具,File->Setting->Tools->External Tools添加两个:

Android studio 创建so文件

Android studio 创建so文件

program分别是javah和ndk-build的路径

2.创建一个java文件:

 

Android studio 创建so文件

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快捷工具

 

Android studio 创建so文件

若有编码GBK的不可映射字符,则javah工具改为:

 

Android studio 创建so文件

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工具

 

Android studio 创建so文件

在libs文件下生成了so文件:

 

Android studio 创建so文件

9.运行成功

 

Android studio 创建so文件

以下是各种出错的解决方案
1.
android.enableAapt2=false
Error:Execution failed for task ':app:compileDebugNdk'.
> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio.  Please switch to a supported build system.
  Consider using CMake or ndk-build integration. For more information, go to:
  https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile
  To get started, you can use the sample ndk-build script the Android
  plugin generated for you at:
  E:\first_so2\app\build\intermediates\ndk\debug\Android.mk
  Alternatively, you can use the experimental plugin:
  https://developer.android.com/r/tools/experimental-plugin.html
  To continue using the deprecated NDK compile for another 60 days, set 
  android.deprecatedNdkCompileLease=1540114719135 in gradle.properties
网上大多办法是用CMake和LLDB来解决,很麻烦,而且也没能解决我的问题。
只要把在gradle.properties里面添加的android.useDeprecatedNdk=true改成报错里面的android.deprecatedNdkCompileLease=1540114719135就可以了。
3.若遇到Execution failed for task ':app:compileDebugNdk'.参考:https://blog.csdn.net/Mr_Feng_/article/details/53065071?utm_source=blogxgwz0
4.若遇到Cannot resolve corresponding JNI function,参考:https://blog.csdn.net/a123473915/article/details/77863075.
5.
Error:Execution failed for task ':app:preDebugAndroidTestBuild'.
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.
在 build.gradle 添加
configurations.all { resolutionStrategy.force 'com.android.support:support-annotations:27.1.1' }

 

相关文章: