内容简介: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");
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
黑客大曝光
Joel Scambray、Vincent Liu、Caleb Sima / 姚军 / 机械工业出版社华章公司 / 2011-10 / 65.00元
在网络技术和电子商务飞速发展的今天,Web应用安全面临着前所未有的挑战。所有安全技术人员有必要掌握当今黑客们的武器和思维过程,保护Web应用免遭恶意攻击。本书由美国公认的安全专家和精神领袖打造,对上一版做了完全的更新,覆盖新的网络渗透方法和对策,介绍如何增强验证和授权、弥补Firefox和IE中的漏洞、加强对注入攻击的防御以及加固Web 2.0安全,还介绍了如何将安全技术整合在Web开发以及更广泛......一起来看看 《黑客大曝光》 这本书的介绍吧!