1,环境部署
AndroidStudio(4.xxx以上版本)安装NDK、CMake插件/
2,简单示例
(1)main目录下创建jni子目录
(2)创建demo.cpp文件
注意,方法名对应native方法目录,如com.zjw.demo目录下MainActivity#getFromJni()声明如下:
#include "demo.h"
#include<jni.h>
#include<stdio.h>
extern "C"
{
JNIEXPORT jstring JNICALL Java_com_zjw_demo_MainActivity_getFromJNI(JNIEnv *env, jobject obj ){
return env -> NewStringUTF("Hello,I am from JNI!");
}
}
(3)创建Android.mk和Application.mk文件
这两个文件是用来指定编译路径、编译平台等配置
//Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello_jni
LOCAL_SRC_FILES := demo.cpp
include $(BUILD_SHARED_LIBRARY)
//Application.mk
//空
LOCAL_MODULE是生成so库名。
(4)activity中声明native方法
System.loadLibrary()方法是生成so库libxxx后xxx,也就是之前声明的模块名
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.myapplication.R;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("hello_jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.demo).setOnClickListener(view -> {
((Button) findViewById(R.id.demo)).setText(getFromJNI());
});
}
public native String getFromJNI();
}
(5)生成so库
切换命令行到jni目录,运行”ndk-build“命令,自动生成so库。
如果找不到目录,请配置环境变量或者ndk-build全路径输入。
自动生成jniLibs目录,如果生成的是libs目录,请改名,否则找不到so库。生成各架构平台下的so库。
(6)运行
点击按钮,就能拿到jni返回的字符串了