java ndk_NDK开发学习笔记之 javah 及 ndk-build
上一篇写到 NDK 的基本使用及环境搭建。
并写了一个简单的 cpp 文件,但是有没有发现在编写 cpp 文件中的函数时,名字是不是很长,很容易写错!
那么,哟没有方法,自动生成函数名呢?没错,你猜对了,还真有这样的工具—— javah。下面就来介绍 javah 的使用以及以下小技巧,此外还有 ndk-build 生成 so 的方法。
概要
javah 的使用
ndk-build 的使用
1. javah
上一篇讲过,jni 中函数名的书写方式,再来回顾一下。
(1)函数名:JNIEXPORT + 返回类型 + JNICALL Java_+包名 +类型 + 函数名(java 中声明的),以下划线连接
(2)返回值类型,是 jni 中的数据类型,若没有返回类型,则使用void
(3)默认传入两个参数 JNIEnv* env(jvm运行环境), jobject obj(调用这个函数的Java对象)
#include
extern "C" {
/*
* Class: com_ralf_www_jnitest_JniUtils
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ralf_www_jnitest_JniUtils_getString
(JNIEnv *env, jclass jc){
const char* ch = "String From JNI";
return env->NewStringUTF(ch);
}
}
但是这么长的名字很容易写错,特别在包名中出现一些特殊符号时,如,下划线(com.example.my_jni),这时候可以使用 javah 来自动生成头文件,里面会有完整的函数名。下面就来看一下实现的步骤。
主要是 4 个步骤:
利用 javah 命令来编译出对应的头文件,
建立 cpp 文件,如 MyJni.cpp,然后复制头文件中函数名,粘贴进去,然后再编写函数的方法体
在 android.mk 中添加自己新建立的 cpp 文件名
编译 so 库
详细说明:
(1) 在 main 文件夹下建立 jni 文件夹
切换到 java 文件夹下,shift +右键,打开命令行窗口,执行下面命令
javah -classpath ./java -d ../jni com.ralf.www.jnitest.JniUtils
注意:
-classpath 表示类文件路径
./java 表示java当前的文件夹
-d表示生成头文件所在路径
../jni 表示 jni 文件夹下,这样写是因为当前文件夹时 java 文件夹下,..表示上一级文件夹,即 main,再加上 /jni 表示 jni 文件夹
com.ralf.www.jnitest.JniUtils,表示需要编译的类文件,也就是包名+类名(也就是包含 native 方法的类文件)
GBK编译
忽略提示错误,“错误,编码 GBK 的不可映射字符”,此时,对应的头文件已经生成。可以打开看到里面的内容,如下。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_ralf_www_jnitest_JniUtils */
#ifndef _Included_com_ralf_www_jnitest_JniUtils
#define _Included_com_ralf_www_jnitest_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ralf_www_jnitest_JniUtils
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ralf_www_jnitest_JniUtils_getString
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
(2) 在 jni 文件及下新建一个源文件 .cpp 文件,拷贝头文件中的内容到 cpp 文件中,只保留 extern "C"{。。。} 中的内容
注意,函数的参数(JNIEnv , jclass)中,需要更改下,(JNIEnvenv, jclass jc)
(3) 在 android.mk 中添加需要编译的文件,即 MyJni.cpp
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libjnitest
LOCAL_SRC_FILES := MyJni.cpp
include $(BUILD_SHARED_LIBRARY)
2.编译 so 库
方式一:ndk-build
方式二:利用gradle
(1)ndk-build:
ndk-build 文件是 Android NDK r4 中引入的一个 shell 脚本。其用途是调用正确的 NDK 构建脚本。上一篇文章中也已经给出 NDK 的相关介绍,脑图中列举了基本的NDK先关知识点。
要想使用 ndk-build 命令,首先需要将该命令添加到环境变量,要不然使用会有点麻烦,添加环境变量的操作这里就不赘述了,请自行百度、谷歌。
主要说下怎么操作:
切换到工程的 main 文件夹下--->shift + 右键 开启命令行窗口--->输入 ndk-build 命令执行编译,生成 so 库。So 库放置的位置是在 main 文件夹下的 libs 文件夹,里面有不同机器的 so 库,生成不同版本的 so 的设置在 Application.mk 文件中设置,本例中设置 APP_ABI :=all
lib路径
(2)利用 gradle 配置
a. 指定 NDK 路径
在 local.properties 文件下设置
ndk.dir=D\:\\Android\\android-ndk-r10e
sdk.dir=D\:\\Android\\sdk
b. 指定编译的 Android.mk 文件
android {
…
externalNativeBuild{
//指定 Android.mk 文件
ndkBuild{
path 'src/main/jni/Android.mk'
}
}
}
c. 指定property.gradle文件设置
android.useDeprecatedNdk=true
这些操作在上一篇文章中都讲过了,多熟悉几次对你来说应该很简单。
生成的 so 库所在路径,稍微有点隐蔽,看下图
so路径
(3)利用 gradle 配置还有一个快捷方式,一键完成。
在 jni 文件夹上右键选择 “Link C++ Project with Gradle” 一项,然后选择你工程中 android.mk 文件,这样就完成了配置。
3.小技巧
个人认为这个小技巧真的很好用。
(1)命令快捷窗口
利用 javah 命令生成头文件的命令可以在 terminal 窗口输入
javah快捷工具
同样,ndk-build 命令也可以在 terminal 窗口执行
ndk-build快捷工具
(2)将命令设置成快捷工具
在 Settings----External Tools 中设置快捷工具
在设置界面,找到 External Tools,如下图,然后点击右边方框的 “+”,添加 javah 和 ndk 命令快捷工具
javah 快捷工具
external工具
参数设置:
1.Program: $JDKPath$\bin\javah.exe 这里配置的是 javah.exe 的路径
2.Parametes: -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$ 这里 $FileClass$ 指的是要执行操作的类名(包名.类名),$ModuleFileDir$/src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。
3.Working: $ModuleFileDir$\src\main\java
使用方式:
选中 java 文件--->右键---> External Tools--->javah-jni,将生成 jni 文件夹以及文件夹下的包名.类名的.h头文件 (名字过长,我们可以自己重命名)。
ndk-build 命令快捷方式
ndk编译工具
设置参数:
1.Program: F:\apk\sdk\ndk-bundle\ndk-build.cmd 这里配置的是 ndk 下的 ndk-build.cmd 的路径(根据实际情况填写)
2.Working: $ModuleFileDir$\src\main\
使用方式:
选中 C/C++ 文件--->右键--->ExternalTools--->ndk-build,将在 main 文件夹下生成 libs 文件夹以及多个 so 文件,我们可以移动至 jniLibs 目录下去。
当然,还有有一种使用 Cmakelist 方式使用 jni 的方法,这种方法时 AS 新增的功能,后面的文章会介绍该方式的使用方法,敬请期待!
java ndk_NDK开发学习笔记之 javah 及 ndk-build相关推荐
- JAVA企业级开发学习笔记
杂项 JAVA概述 JAVA API 在线文档 www.matools.com JAVA发展历史 1990 sun公司启动绿色计划,1992年创建java语言,1994gosling参加硅谷大会演示j ...
- java微信自动回复机器人开发(java微信开发学习笔记3)
微信自动回复机器人原理很简单,获取用户发送到后台的数据,然后调用机器人的api进行回复即可.我使用的茉莉机器人,官网地址如下: http://www.itpk.cn/ 茉莉机器人的api:http:/ ...
- JAVA串口开发学习笔记1
1.下载java Communications api开发包. 2.将win32com.dll拷贝入C:\j2sdk1.4.2_04\bin 3.将comm.jar拷贝入C:\j2sdk1.4.2_ ...
- Java企业开发学习笔记(1.2)利用组件注解符精简Spring配置文件
该文章主要为完成实训任务,详细实现过程及结果见[http://t.csdn.cn/iSeSH] 文章目录 一. 利用组件注解符精简Spring配置文件 1.1 创建新包 1.2 复制四个类 1.3 修 ...
- Java企业开发学习笔记(1.5.1)采用配置方式使用AOP
该文章主要为完成实训任务,详细实现过程及结果见[http://t.csdn.cn/FBkpc] 文章目录 一.采用配置方式使用AOP 1.1 创建所需子包 1.2 创建杀龙任务类 1.3 创建勇敢骑士 ...
- Java企业开发学习笔记(1.1)采用Spring配置文件管理Bean
该文章主要为完成实训任务,详细实现过程及结果见[http://t.csdn.cn/iK3aM] 文章目录 1. 创建Maven项目 2. 添加Spring依赖 3. 创建杀龙任务 4. 创建勇士类 5 ...
- Java快速入门学习笔记1 | Eclipse使用
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- java程序开发个人笔记_Java程序开发入门笔记
Java程序开发入门笔记 如果你是这一个错误的话:错误:编码GBK的不可映射字符 这是因为我们编写的代码一般都是utf-8的格式而控制台用的不是utf-8格式所以就会出现中文输出的错误.这个时候我们可 ...
- Go语言开发学习笔记(持续更新中)
Go语言开发学习笔记(持续更新中) 仅供自我学习 更好的文档请选择下方 https://studygolang.com/pkgdoc https://www.topgoer.com/go%E5%9F% ...
最新文章
- android webview实例,android WebView 使用实例
- 面试 -- 多线程( 一) -- 基础
- windows 7开启telnet功能
- RxJS CombineLatest operator 的一个具体使用例子
- 支付宝瓜分9亿,20倍大概能分到多少钱?
- 大数据可视化需要遵循哪几个核心原则
- IDispatch接口原理与应用
- Excel运用: Excel的窗口冻结与拆分
- FBreader多端同步心得补充
- 如何将bmp转化为jpg,bmp转jpg方法
- idou老师教你学Istio11 : 如何用Istio实现流量熔断
- 3d模型 vv5_你也想做锦鲤信小呆?WEY VV5升级款这就来满足你!
- 实时数仓 大数据 Hadoop flink kafka
- 3d打印测温模型单塔双塔tt pro专业版测温模型stl下载
- Creator打android包时报Could not resolve all files for configuration ':jcore-react-native:lintClassPath'异
- IAR代码溢出问题处理section placement failed
- Js的Generator函数(一)
- 世界气象日话“海洋气象”系列之——CMRC
- 纯css炫酷动态加载条
- BUUCTF misc 专题(25)神秘龙卷风
热门文章
- GEOTRANS 3.7 用户使用手册 ------ 文件处理(坐标文件格式)
- 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 BertViz
- 自我表白,我很帅很酷的阳光的男孩
- java读取文件按照空格_java实现读取txt文件并以在每行以空格取数据
- 网络通信协议基础(ISIS)——概述
- 如何让U盘同时兼容Windows和Mac OS X系统
- 面试:25匹马,5个赛道,选出前三,最优解
- python文件包括两种类型_python第六篇文件处理类型
- 全民一起VBA实战篇 专题3 第一回 格式化规定各人迥异,Format函数一招摆平
- xshell7官方下载链接