参考资料
Android JNI NDK C++ so本地验证 获取应用签名
System.load 和 System.loadLibrary详解
1 配置环境
首先需要下载ndk,在AndroidStudio中如下图

然后在项目中配置ndk的路径,如下图:

2 使用步骤
2.1 修改项目下gradle.properties文件
添加如下命令:
android.useDeprecatedNdk=true
2.1 配置app下的build.gradle
defaultConfig下增加ndk配置:
defaultConfig {
applicationId "com.mobile.androidtest"
minSdkVersion 11
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
//生成.so的文件名称
moduleName "hellojnilib"
abiFilters "armeabi"
}
}
2.1 创建调用native方法的java类
package com.mobile.androidtest;
/**
* @author huangjian
* @create 2018/7/17 0017
* @Description
*/
public class JNIUtil {
static {
//装载JNI库文件,也可以在使用的地方进行装载
//必须与app下的build.gradle中moduleName相同
System.loadLibrary("hellojnilib");
}
public static native String getNativeStr();
}
使用AndroidStudio中Build->Make Project 进行编译生成class文件,如下图:


命令行进入app->build->intermediates->classes->debug 目录(AndroidStudio下可以直接将debug拉入命令行就会直接进入该目录)
使用javah -jni com.mobile.androidtest.JNIUtil命令生成com_mobile_androidtest_JNIUtil.h文件,命令的格式是javah -jni 包名.包含native方法的类
如下图

创建jni文件目录,具体步骤如下图:


将生成的com_mobile_androidtest_JNIUtil.h文件copy到jni目录下,在jni目录中新建c source文件hellojni.cpp(名字可以取任意的),内容如下:
//
// Created by Administrator on 2018/7/17 0017.
//
#include "com_mobile_androidtest_JNIUtil.h"
JNIEXPORT jstring JNICALL Java_com_mobile_androidtest_JNIUtil_getNativeStr(JNIEnv *env, jclass thiz){
return (env)->NewStringUTF("Hello JNI");
}
方法名剪切自com_mobile_androidtest_JNIUtil.h,注意需要加上入参名称和返回值,如下图:


再次使用使用AndroidStudio中Build->Make Project 进行编译,会生成.so的动态链接库,生成后的目录如下:

把该lib下的所有为文件拷贝到,app下的libs中,然后在Activity中调用,如下:
package com.mobile.androidtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, JNIUtil.getNativeStr(), Toast.LENGTH_LONG).show();
}
}
