这篇文章是使用ndk build的方式开始写jni,后面再接触cmake。

文章参考:https://juejin.im/post/5a67dcdb518825732c53b338

基础:https://blog.csdn.net/lfdfhl/column/info/20840

结构体:如下几种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct st {
char name[32];
int age;
};
typedef st Person;


typedef struct book {
int page;
} Book;


typedef struct {
int day;
} Date;

结构体:与指针

1
2
3
4
void initPerson(Person *p) {
(*p).age = 18;
p->age = 23;
}

1.使用as的External Tools的功能添加好javah命令

1
2
3
Pragram             $JDKPath$/bin/javah
Arguments -d $ModuleFileDir$/src/main/cpp $FileClass$
Working Directory $ModuleFileDir$/src/main/java

2.编写java里面的jni方法

1
2
3
4
package com.ai.hellosample.tools;
public class Util {
public static native String getDeviceId();
}

然后使用刚才的javah命令生成好头文件在src/main/cpp里面。

3.实现jni方法

在src/main/cpp里面创建Util.cpp类。

1
2
3
4
5
#include "com_ai_hellosample_tools_Util.h"
jstring Java_com_ai_hellosample_tools_Util_getDeviceId(JNIEnv *env, jclass thiz) {
jstring js = env->NewStringUTF("nj");
return (*env).NewStringUTF("id");
}

4.创建Android.md文件

1
2
3
4
5
6
7
8
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := Hello-Util
LOCAL_SRC_FILES := Util.cpp

include $(BUILD_SHARED_LIBRARY)

Application.mk

1
2
3
4
5
# 原生库名称
APP_MODULES := Hello-Util

# 指定机器指令集
APP_ABI := armeabi armeabi-v7a arm64-v8a

5.build.gradle配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apply plugin: 'com.android.application'

android {
compileSdkVersion 28

defaultConfig {
applicationId "com.ai.hellosample"
minSdkVersion 18
targetSdkVersion 28
versionCode 100
versionName "1.0.0"
}

externalNativeBuild {
ndkBuild {
path 'src/main/cpp/Android.mk'
}
}

}