Android-NDK开发入门

}
}
}

dependencies {
// 省略引用的第三方库
}

可以看到,相比普通的Android应用,build.gradle配置中多了两个externalNativeBuild配置项。其中,defaultConfig里面的的externalNativeBuild主要是用于配置Cmake的命令参数,而外部的
externalNativeBuild的主要是定义了CMake的构建脚本CMakeLists.txt的路径。

然后,我们来看一下CMakeLists.txt文件,CMakeLists.txt是CMake的构建脚本,作用相当于ndk-build中的Android.mk,代码如下。

设置Cmake最小版本

cmake_minimum_required(VERSION 3.4.1)

编译library

add_library( # 设置library名称
native-lib

设置library模式

SHARED模式会编译so文件,STATIC模式不会编译

SHARED

设置原生代码路径

src/main/cpp/native-lib.cpp )

定位library

find_library( # library名称
log-lib

将library路径存储为一个变量,可以在其他地方用这个变量引用NDK库

在这里设置变量名称

log )

关联library

target_link_libraries( # 关联的library
native-lib

关联native-lib和log-lib

${log-lib} )

关于CMake的更多知识,可以查看CMake官方手册

官方示例

默认创建Android NDK工程时,Android提供了一个简单的JNI交互示例,返回一个字符串给Java层,方法名的格式为:Java_包名_类名_方法名 。首先,我们看一下native-lib.cpp的代码。

#include <jni.h>
#include

extern “C” JNIEXPORT jstring JNICALL
Java_com_xzh_ndk_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = “Hello from C++”;
return env->NewStringUTF(hello.c_str());
}

然后,我们在看一下Android的MainActivity.java 的代码。

package com.xzh.ndk;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

static {
System.loadLibrary(“native-lib”);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}

public native String stringFromJNI();
}

初识Android JNI

1,JNI开发流程

  1. 编写java类,声明了native方法;
  2. 编写native代码;
  3. 将native代码编译成so文件;
  4. 在java类中引入so库,调用native方法;

2,native方法命名

extern “C”
JNIEXPORT void JNICALL
Java_com_xfhy_jnifirst_MainActivity_callJavaMethod(JNIEnv *env, jobject thiz) {

}

函数命名规则: Java_类全路径_方法名,涉及的参数的含义如下:

  • JNIEnv*是定义任意native函数的第一个参数,表示指向JNI环境的指针,可以通过它来访问JNI提供的接口方法。
  • jobject表示Java对象中的this,如果是静态方法则表示jclass。
  • JNIEXPORT和JNICALL: 它们是JNI中所定义的宏,可以在jni.h这个头文件中查找到。

3,JNI数据类型与Java数据类型的对应关系

首先,我们在Java代码里编写一个native方法声明,然后使用【alt+enter】快捷键让AS帮助我们创建一个native方法,如下所示。

public static native void ginsengTest(short s, int i, long l, float f, double d, char c,
boolean z, byte b, String str, Object obj, MyClass p, int[] arr);

//对应的Native代码
Java_com_xfhy_jnifirst_MainActivity_ginsengTest(JNIEnv *env, jclass clazz, jshort s, jint i, jlong l, jfloat f, jdouble d, jchar c,
jboolean z, jbyte b, jstring str, jobject obj, jobject p, jintArray arr) {

}

下面,我们整理下Java和JNI的类型对照表,如下所示。

Java 类型 Native类型 有无符合 字长
boolean jboolean 无符号 8字节
byte jbyte 有符号 8字节
char jchar 无符号 16字节
short jshort 有符号 16字节
int jint 有符号 32字节
long jlong 有符号 64字节
float jfloat 有符号 32字节
double jdouble 有符号 64字节

对应的引用类型如下表所示。

Java 类型 Native类型
java.lang.Class jclass
java.lang.Throwable jthrowable
java.lang.String jstring
jjava.lang.Object[] jobjectArray
Byte[] jbyteArray
Char[] jcharArray
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值