一.前言

1.开发环境,windows 系统,Android Studio 3.1.2
2.Ndk下载(不需要翻墙,ndk环境配置自行百度)
3.本篇文章适合,首次接触jni方面的童靴,大佬请绕道;

二.创建demo,生成so文件

1.1.创建JniSoTest工程

  • 新建一个Android Studio工程(同创建其它工程一样)JniSoTest,新建一个JniSo.java文件。

    1. //JniSo类
    2. public class JniSo {
    3. static {
    4. System.loadLibrary("JniSo");
    5. }
    6. public native static String getString();
    7. }

1.2.执行make project

  • 在导航栏上操作,build —> make project,然后可以看到生成的JniTest类的class文件,路径为:app\build\intermediates\classes\debug\jack\jnisotest\JniSo.class,其中jack\jnisotest\由自己的包名决定;
    • 注意:
      • JniTest.class文件的生成还有另外一种方式,在控制台输入命令,进入JniTest.java所在的目录。然后使用javac JniTest.java命令,即可生成JniTest.class文件;使用该方式生成的class文件,那么对应的生成头文件的步骤也不同。需要回到C:\project_learn\JniSoTest\app\src\main\java>目录,执行命令:

    javah -jni jack.jnisotest.JniSo。其中jack.jnisotest由包名决定;

    • 使用Android studio 3.4尝试了build —> make project,没有出现JniTest.class文件。具体原因自己没有搞明白;

1.3.生成头文件

  • 打开Android Studio的控制台,也就是Terminal,执行命令:

    1. javah -jni -classpath C:\project_learn\JniSoTest\app\build\intermediates\classes\debug jack.jnisotest.JniSo
    2. //其中jack.jnisotest为包名
  • 执行1.3中的命令之后,会在当前目录下生成文件:jack_jnisotest_JniSo.h ``` / DO NOT EDIT THIS FILE - it is machine generated /

    include

    / Header for class jack_jnisotest_JniSo /

ifndef _Included_jack_jnisotest_JniSo

define _Included_jack_jnisotest_JniSo

ifdef __cplusplus

extern “C” {

endif

/*

  • Class: jack_jnisotest_JniSo
  • Method: getString
  • Signature: ()Ljava/lang/String; / JNIEXPORT jstring JNICALL Java_jack_jnisotest_JniSo_getString (JNIEnv , jobject);

ifdef __cplusplus

}

endif

endif

  1. <a name="4VCIB"></a>
  2. ### 1.4.新建jni目录
  3. - 在main目录下新建一个目录,命名为jni,将生成的.h文件放在jni目录下;
  4. ![1556557283(1).jpg](https://cdn.nlark.com/yuque/0/2019/jpeg/249982/1556557307782-8af64ff5-e67c-4af7-acb3-2adcac36d37d.jpeg#height=749&id=EsuEP&name=1556557283%281%29.jpg&originHeight=749&originWidth=927&originalType=binary&ratio=1&size=56768&status=done&style=none&width=927)
  5. <a name="h7IYS"></a>
  6. ### 1.5.创建cpp文件
  7. - 在Jni文件夹下新建JniSo.cpp文件,复制内容

/ DO NOT EDIT THIS FILE - it is machine generated /

include

/ Header for class jack_jnisotest_JniSo /

/*

  • Class: com_jni_jnitest_JNITest
  • Method: getString
  • Signature: ()Ljava/lang/String; / JNIEXPORT jstring JNICALL Java_jack_jnisotest_JniSo_getString (JNIEnv env, jobject jobject){

return (*env).NewStringUTF(“来自JNI的内容”);

}

  1. <a name="dXXoc"></a>
  2. ### 1.6.创建mk文件
  3. - 在jni文件夹下新建Android.mk文件

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniSo LOCAL_SRC_FILES =: JniSo.cpp include $(BUILD_SHARED_LIBRARY)

  1. - jni文件夹下新建Application.mk文件,其中JniSo需要对应JniSo.java中的JniSo

APP_MODULES := JniSo
APP_ABI := all

  1. <a name="42osP"></a>
  2. ### 1.7.gradle配置

android { //省略其它… defaultConfig { //省略其它… ndk { moduleName “JniSo” //JniSo要与JniSo.java中的对应 //abiFilters “armeabi”, “armeabi-v7a”, “x86” //输出指定的三种abi体系下的so库 }

  1. }
  2. //省略其它...
  3. //生成的so文件所在的位置
  4. sourceSets.main{
  5. jniLibs.srcDirs = ['libs']
  6. }

}

  1. <a name="yrhtJ"></a>
  2. ### 1.8.so文件生成
  3. - 在控制台上使用ndk-build命令
  4. > 注意:先查看当前所在目录的位置,C:\project_learn\JniSoTest\app\src\main\java>,即在xxx\app\src\main\java目录下,输入命令:ndk-build,即可生成so文件;
  5. <a name="5ioX9"></a>
  6. ### 1.9.使用so库

//注意1:使用之前,可以将so文件迁移到对应的位置 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

  1. //注意2:若new JniSo().getString()显示黄色,可能so库调用不会成功,
  2. //需要重新检查以上操作是否出现问题
  3. ((TextView)findViewById(R.id.tv)).setText(new JniSo().getString());
  4. }

}

```