内容简介:Android_JNI_Learn
下载安装CMake、LLDB、NDK
Android Studio的一些配置
手动添加一些快捷方式Tools->External Tools->add
javah 用于生成头文件 Program:$JDKPath$/bin/javah Parameters:-d ../jni -jni $FileClass$ Working directory:$SourcepathEntry$\..\java ndk-build 用于构建so包 注意:MAC/Linux用ndk-build,没有.cmd后缀 Program:D:\adt\sdk\ndk-bundle\ndk-build.cmd Parameters:什么都不用填 Working directory:$ModuleFileDir$\src\main
在新建项目的时候默认会配置好所有的环境,如果是旧的项目需要以下准备:
在gradle.properties文件中添加对过时的NDK的兼容使用
android.useDeprecatedNdk=true
在模块的 build.gradle
里面添加
android { defaultConfig { externalNativeBuild { cmake { cppFlags "" } } } externalNativeBuild { cmake { path "CMakeLists.txt" } } }
CMakeLists文件
CMakeLists.txt是CMake的配置文件,用于表明版本、依赖、等信息。
cmake_minimum_required(VERSION 3.4.1) add_library(native-lib SHARED src/main/cpp/native-lib.cpp) find_library(log-lib log) target_link_libraries(native-lib ${log-lib})
对应的解释
cmake_minimum_required(VERSION 3.4.1)
CMake最小版本使用的是3.4.1。
add_library()
配置so库信息(为当前当前脚本文件添加库)
native-lib
这个是声明引用so库的名称,在项目中,如果需要使用这个so文件,引用的名称就是这个。值得注意的是,实际上生成的so文件名称是libnative-lib。
SHARED
这个参数表示共享so库文件,也就是在Run项目或者build项目时会在目录intermediates\transforms\mergeJniLibs\debug\folders\2000\1f\main下生成so文件。
src/main/cpp/native-lib.cpp构建so库的源文件。
find_library()
查找一个库文件
log-lib
这个指定的是在NDK库中每个类型的库会存放一个特定的位置,而log库存放在log-lib中
log
指定使用log库
target_link_libraries()如果你本地的库(native-lib)想要调用log库的方法,那么就需要配置这个属性,意思是把NDK库关联到本地库。
native-lib要被关联的库名称
${log-lib}要关联的库名称,要用大括号包裹,前面还要有$符号去引用。
JNIEXPORT jstring JNICALL Java_com_glee_myapplication_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); }
JNIEXPORT & JNICALL
JNIEXPORT和JNICALL这两个宏(被定义在jni.h)确保这个函数在本地库外可见,并且编译器会进行正确的调用转换。
函数规范
在JNI中C/C++的函数名是有规范要求的,由以下几部分串接而成
-
Java_
前缀 - 完全限定的类名,并用下划线
_
作为分隔符 - 第一参数
JNIEnv* env
- 第二个参数
jobject
或jclass
- 其他参数按类型映射
- 返回参数按类型映射
操作
编写 Native
方法
下面来写几个 Native
方法:
external fun getStr(): String external fun getHelloJniStr(): String
生成头文件
右键MainActivity->External Tools->javah:
然后就会帮我们生成:
编写Cpp函数
#include<jni.h> #include<string> extern "C" JNIEXPORT jstring JNICALL Java_top_jowanxu_jnidemo_MainActivity_getStr(JNIEnv *env, jobject instance) { return env->NewStringUTF("Java_top_jowanxu_jnidemo_MainActivity_getStr"); } extern "C" JNIEXPORT jstring JNICALL Java_top_jowanxu_jnidemo_MainActivity_getHelloJniStr(JNIEnv *env, jobject instance) { return env->NewStringUTF("Java_top_jowanxu_jnidemo_MainActivity_getHelloJniStr"); }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java学习笔记
林信良 / 清华大学出版社 / 2015-3-1 / CNY 68.00
●本书是作者多年来教学实践经验的总结,汇集了学员在学习课程或认证考试中遇到的概念、操作、应用等问题及解决方案 ●针对Java SE 8新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新 ●详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对照关系 ●从Java SE API的源代码分析,了解各种语法在Java SE API中的具体应用 ......一起来看看 《Java学习笔记》 这本书的介绍吧!