一.前言
1.开发环境,windows 系统,Android Studio 3.1.2
2.Ndk下载(不需要翻墙,ndk环境配置自行百度)
3.本篇文章适合,首次接触jni方面的童靴,大佬请绕道;
二.创建demo,生成so文件
1.1.创建JniSoTest工程
- 新建一个Android Studio工程(同创建其它工程一样)JniSoTest,新建一个JniSo.java文件。
//JniSo类
public class JniSo {
static {
System.loadLibrary("JniSo");
}
public native static String getString();
}
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,执行命令:
javah -jni -classpath C:\project_learn\JniSoTest\app\build\intermediates\classes\debug jack.jnisotest.JniSo
//其中jack.jnisotest为包名
- 执行1.3中的命令之后,会在当前目录下生成文件:jack_jnisotest_JniSo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 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.4.新建jni目录
- 在main目录下新建一个目录,命名为jni,将生成的.h文件放在jni目录下;
1.5.创建cpp文件
- 在叫文件夹下新建JniSo.cpp文件,复制内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jack_jnisotest_JniSo.h>
/* 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.6.创建mk文件
- 在jni文件夹下新建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniSo
LOCAL_SRC_FILES =: JniSo.cpp
include $(BUILD_SHARED_LIBRARY)
- 在jni文件夹下新建Application.mk文件,其中JniSo需要对应JniSo.java中的JniSo
APP_MODULES := JniSo
APP_ABI := all
1.7.gradle配置
android {
//省略其它...
defaultConfig {
//省略其它...
ndk {
moduleName "JniSo" //JniSo要与JniSo.java中的对应
//abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定的三种abi体系下的so库
}
}
//省略其它...
//生成的so文件所在的位置
sourceSets.main{
jniLibs.srcDirs = ['libs']
}
}
1.8.so文件生成
- 在控制台上使用ndk-build命令
注意:先查看当前所在目录的位置,C:\project_learn\JniSoTest\app\src\main\java>,即在xxx\app\src\main\java目录下,输入命令:ndk-build,即可生成so文件;
1.9.使用so库
//注意1:使用之前,可以将so文件迁移到对应的位置
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注意2:若new JniSo().getString()显示黄色,可能so库调用不会成功,
//需要重新检查以上操作是否出现问题
((TextView)findViewById(R.id.tv)).setText(new JniSo().getString());
}
}