内容简介: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");
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ActionScript 3.0 Cookbook
Joey Lott、Darron Schall、Keith Peters / Adobe Dev Library / 2006-10-11 / GBP 28.50
Well before Ajax and Microsoft's Windows Presentation Foundation hit the scene, Macromedia offered the first method for building web pages with the responsiveness and functionality of desktop programs......一起来看看 《ActionScript 3.0 Cookbook》 这本书的介绍吧!