NDK Samples [1] - hello-jni

字数 158阅读 223

NDK Samples目录:GoogleSamples - NDK Samples


项目地址:https://github.com/googlesamples/android-ndk/tree/master/hello-jni
说明文档:https://github.com/googlesamples/android-ndk/blob/master/hello-jni/README.md

该项目演示如何从Java调用C代码,使用cmake插件编译。


最低要求:

  1. Android Studio 版本大于 2.2

该项目演示了如何从Java代码调用C方法,并获取返回值。

  1. HelloJni :: stringFromJNI();
    演示了如何从java层调用C层对应stringFromJNI的方法。

HelloJni

/*
  该方法在hello-jni实现。
  可以通过ctrl+鼠标左键跳转到c方法。
 */
public native String stringFromJNI();

/* 
  该方法并没有任何的实现,纯粹展示了可以在同一个文件定义多个native方法。
  在IDE上显示为红色,提示没有找到该方法的c实现方法。
  调用会抛出UnsatisfiedLinkError
 */
public native String  unimplementedStringFromJNI();

/* 
  要使用上述的native方法,需要先加载对应的动态库,本例为加载hello-jni库。
  包中的动态库会被pm解压到 /data/data/[ packagename ]/lib 中。
 */
static {
    System.loadLibrary("hello-jni");
}

hello-jni.c

/*
  导入jni.h
  java和c之间的交互基本由此实现,包括数据转换,方法调用等。
 */
#include <jni.h>

/*
  stringFromJNI()的实现,返回一个包含平台类型信息的字符串
 */
JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz)
{
    // 根据平台定义一个ABI宏
    ...
    
    return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}

CMakeLists.txt

# 配置cmake最低版本要求 3.4.1
cmake_minimum_required(VERSION 3.4.1)

# 使用指定的源文件,生成链接文件,并加入工程
# 此处则是:
# 指定使用 hello-jni.c (同目录下),
# 生成 hello-jni 链接文件,
# 通过 SHARED 指定链接文件为动态链接库。
add_library(hello-jni
            SHARED
            hello-jni.c)

# target_link_libraries要写在add_library之后
# 为目标文件链接其所需要的库
# 注意,库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面
target_link_libraries(hello-jni
                      android
                      log)

相对简单的项目,NDK开发的Hello World,只是编译工具换成了Cmake。

推荐阅读更多精彩内容