一、创建项目
我们先创建一个空项目
在MainActivity.java中加入以下代码:
package com.example.demo_jni;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("jni_demo");// 同 android.mk 中 LOCAL_MODULE 值
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this,getstring(),Toast.LENGTH_LONG).show();
}
public native CharSequence getstring();
}
二、生成.h文件
打开cmd命令行找到项目的java文件夹,例如:
cd E:\AndroidProject\jni_demo\app\src\main\java
输入以下命令:
javah -jni com.example.jni_demo.MainActivity
如果没有报错就会在java文件夹下生成com_example_jni_demo_MainActivity.h文件。
我们在main文件夹下新建一个jni文件夹将刚才的.h文件复制到jni目录下并改名为:jni_demo.h
cmd命令cd到jni目录:
cd E:\AndroidProject\jni_demo\app\src\main\jni
创建一个jni_demo.c文件
编写以下代码(代码从.h文件中复制出来):
#include "jni_demo.h"
JNIEXPORT jobject JNICALL Java_com_example_demo_1jni_MainActivity_getstring
(JNIEnv *env, jobject obj){
jstring str= (*env)->NewStringUTF(env,"Hello NDK");
return str;
}
在同目录创建 Android.mk 和 Application.mk 文件
分别编写以下代码:
#Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni_demo #模块名称
LOCAL_SRC_FILES := jni_demo.c #源文件 .c或者.cpp
LOCAL_ARM_MODE := arm #编译后的指令集 ARM指令
LOCAL_LDLIBS += -llog #依赖库
include $(BUILD_SHARED_LIBRARY) #指定编译文件的类型
#Application.mk
APP_ABI := all
在cmd输入命令:
ndk-build
输出:
[arm64-v8a] Compile : jni_demo <= jni_demo.c
[arm64-v8a] SharedLibrary : libjni_demo.so
[arm64-v8a] Install : libjni_demo.so => libs/arm64-v8a/libjni_demo.so
[x86_64] Compile : jni_demo <= jni_demo.c
[x86_64] SharedLibrary : libjni_demo.so
[x86_64] Install : libjni_demo.so => libs/x86_64/libjni_demo.so
[mips64] Compile : jni_demo <= jni_demo.c
[mips64] SharedLibrary : libjni_demo.so
[mips64] Install : libjni_demo.so => libs/mips64/libjni_demo.so
[armeabi-v7a] Compile arm : jni_demo <= jni_demo.c
[armeabi-v7a] SharedLibrary : libjni_demo.so
[armeabi-v7a] Install : libjni_demo.so => libs/armeabi-v7a/libjni_demo.so
[armeabi] Compile arm : jni_demo <= jni_demo.c
[armeabi] SharedLibrary : libjni_demo.so
[armeabi] Install : libjni_demo.so => libs/armeabi/libjni_demo.so
[x86] Compile : jni_demo <= jni_demo.c
[x86] SharedLibrary : libjni_demo.so
[x86] Install : libjni_demo.so => libs/x86/libjni_demo.so
[mips] Compile : jni_demo <= jni_demo.c
[mips] SharedLibrary : libjni_demo.so
[mips] Install : libjni_demo.so => libs/mips/libjni_demo.so
表示成功。
在app目录下build.gradle文件中加入
android {
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
}
问题集锦:
问题一:
Compatible side by side NDK version was not found. Default is 20.0.5594570.
tools–>sdk manager–>Android sdk–>sdk tools–>show package detail–>找到NDK(side by side) 具体版本,完成下载并安装即可
问题二:
app闪退,但是如果不加载.so却可以正常,那么基本是.so文件路径不对。或者版本不对。