Android开发中在JAVA中调用C/C++ native代码

本文介绍了在Android开发中如何从Java代码调用C/C++的本机代码,包括五个步骤:编写C/C++代码、编写Java代码、使用javah生成头文件、编写Android.mk文件和编译程序。详细阐述了每个步骤的细节,适用于需要利用C/C++库功能的开发者。
摘要由CSDN通过智能技术生成

Android 从Java调用C/C++

当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码:

  • 希望用更低级、更快的编程语言C/C++去实现对时间有严格要求的代码。

  • 希望从 Java 程序访问旧代码或代码库。

  • 需要标准 Java 类库中不支持的依赖于平台的特性。

我为什么需要它?我的代码背景

我在安卓项目中,需要用到C++的soundtouch库函数,因此必须将调用该库的代码用C++编写,然后再由java调用C++本机代码。

前提:已经配置好支持交叉调用的NDK(Native Development Kit,java与C/C++交叉调用的工具),并为你的工程创建好builder,配置可参照另一篇博文:http://my.oschina.net/liusicong/blog/311886

问题及动机

网上有很多jni教程,但是对于安卓开发爱好者,如何在java代码中调用C/C++函数,实现我们想要的功能,却没有一个十分合适的教程,因此我写下本文。

我要解决的问题:安卓前端有一个按钮,点击该按钮就可以实现“声音特效处理”的功能。而这个功能的后台实现的主要逻辑由C/C++代码编写,因此需要从java调用C/C++代码。

须知:SWIG和javah的区别(强烈推荐)

我看了网上的关于 jni编程 的教程很多,但不尽相同,刚开始会犯迷糊。我想笔者往往忽略了一个关键点,那就是采用了什么方式决定了步骤的流程。有两种生成 jni的方式:一种是通过SWIG从C++代码生成过度的java代码;另一种是通过javah的方式从java代码自动生成过度的C++代码。两种方式下的步骤流程正好相反

第一种方式:由于需要配置SWIG环境,有点麻烦了,所以往往大家不采用这个途径(本文将介绍的步骤就是这种情况),官方文档的例子值得一看:http://www.swig.org/Doc2.0/Android.html#Android_examples_intro。(我抽空把这个官方文档可翻译下)

第二种方式:javah的方式则通过shell指令就可以完成整个流程,所以网上的教程也多数是这一类的,可参照我的另一篇博文http://my.oschina.net/liusicong/blog/315826

解决方案:从 Java 代码调用 C/C++ 的五个步骤

安卓开发中,从 Java 程序调用 C 或 C ++ 代码的过程由五个步骤组成。我们将在深入讨论每个步骤,首先迅速地浏览一下,注意本文采用的方式是:SWIG 方式

  1. 在jni文件夹下编写C/C++代码,实现我们想要实现的C/C++逻辑。

  2. 根据C/C++代码,编写 Java 代码。我们将根据写好的C/C++函数,编写 Java 类,这些类执行三个任务:声明将要调用的native本机方法;装入包含本机代码的共享库;然后调用该本机方法。

  3. 首先用javah生成C/C++ 头文件(.h 文件),然后去改写这个头文件的方法,将我们自己的东西添加进去。C/C++的头文件将声明想要调用的本机函数说明。然后,这个头文件与 C/C++ 函数实现(请参阅步骤 4)一起来创建共享库(请参阅步骤 5)。

  4. 写一个Android.mk文件,放在jni下的C/C++代码文件夹下

  5. 编译运行 Java 程序。运行该代码,并查看它是否有用。我们还将讨论一些用于解决常见错误的技巧。

相关代码目录结构(以我的代码结构为例)

src(放java代码)

   |_ org.tecunhuman. jni 包(自定义命名的包)

       |_ wrapperJNI.java (自己编写的java代码,含native方法)

jni (放C/C++代码)

   |_ soundstrech包(我的C++代码)

             |_ gen包

                      |_ wrapper_wrap.cpp

             |_ Android.mk

             |_ RunParameters.cpp

             |_ RunParameters.h

             |_ SoundStrech.cpp

             |_ SoundStrech.h

             |_ WavFile.cpp

             |_ WavFile.h

             |_ wrapper.i

   |_ soundtouch 包

——————————————————————————————

步骤 1:编写C/C++代码(.cpp文件)放在下jni下的C/C++代码文件夹

我们首先编写一个.cpp文件,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//SoundStrech.cpp代码
#include <stdexcept> 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值