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插件编译。
最低要求:
- Android Studio 版本大于 2.2
该项目演示了如何从Java代码调用C方法,并获取返回值。
- 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。
网友评论