Eclipse编译运行Native代码步骤详解

标签: android jni层   android jni步骤   android jni接口  
转自: http://blog.csdn.net/dengshengjin2234/article/details/10046809

最近一段时间在做native层的开发,把一些经验和技巧记录下来,希望对大家有帮助。本教程以step-by-step的形式给正处入门阶段的native开发新手提供指引。

导言:在进行Android开发的过程中,在一些对性能要求较高的场景,例如图像处理,视音频编解码等,需要使用到native代码以提高运行效率。本教程将在native层进行加法运算和字符串连接,通过这个简单的例子阐述使用eclipse编译运行ndk代码的过程。

注:JNI基础知识不在本文的讨论范围之内,推荐浏览oracle的帮助文档进行系统学习

开发环境:

Adt-bundle(ver:21.1.0) 下载地址:https://developer.android.com/sdk/index.html

Ndk(ver:r8b) 下载地址:https://developer.android.com/tools/sdk/ndk/index.html

示例工程下载地址:https://github.com/ilzc/Code/tree/master/jni

步骤详解:

1、  配置ndk路径

打开Eclipse后,点击菜单栏的Project->Preferences打开Preferences窗口,点击左侧Android->NDK选项,在右侧NDK Location填入ndk的路径

2、  创建工程并增加native支持

点击菜单栏的File->New->Android Application Project创建Android工程。

创建完毕后,在PackageExplorer中右键点击刚才新建的Android项目,选择Android Tools->Add Native Support,按下图填写,点击确认后,工程目录下会增加jni目录,jni目录下有test.cpp和Android.mk。


3、  编写jave层的jni接口

创建一个Java类,类名为Jni

编写加载库的代码,并添加两个native方法

[java]  view plain copy
  1. package com.mylzc.jni;
  2. public class Jni {
  3. static {
  4. System.loadLibrary("test");//加载库 libtest.so
  5. }
  6. public static native int plus(int a, int b);//对应native层的Java_com_mylzc_jni_Jni_plus函数
  7. public static native String getString(String a, String b);//对应native层的Java_com_mylzc_jni_Jni_getString函数
  8. }


4、  编写native层的代码

[cpp]  view plain copy
  1. #include <jni.h>
  2. #include "stdlib.h"
  3. extern "C" {
  4. jint Java_com_mylzc_jni_Jni_plus
  5. (JNIEnv *, jclass, jint x, jint y) {
  6. return x + y;//返回x+y的结果
  7. }
  8. jstring Java_com_mylzc_jni_Jni_getString
  9. (JNIEnv *env, jclass, jstring a, jstring b) {
  10. const char* str_a = env->GetStringUTFChars(a, 0);
  11. const char* str_b = env->GetStringUTFChars(b, 0);
  12. int len_a = strlen(str_a);
  13. int len_b = strlen(str_b);
  14. //concat string
  15. char* str_result = new char[len_a+len_b +1];
  16. strcpy(str_result, str_a);
  17. strcat(str_result,str_b);
  18. jstring jstr_result = env->NewStringUTF(str_result);//创建string对象
  19. delete[] str_result;
  20. env->ReleaseStringUTFChars(a, str_a);
  21. env->ReleaseStringUTFChars(b, str_b);
  22. return jstr_result;//返回ab字符串连接之后的结果
  23. }
  24. }


5、  编写Android.mk

[html]  view plain copy
  1. LOCAL_PATH := $(call my-dir)  #指定源文件目录
  2. include $(CLEAR_VARS) #清空变量
  3. LOCAL_MODULE    := test  #模块名称,对应编译出libtest.so
  4. LOCAL_SRC_FILES := test.cpp #指定要编译的源文件
  5. include $(BUILD_SHARED_LIBRARY) #指定编译动态链接库


6、  编译运行

编译:在Package Explorer视窗,右键点击jni项目,选择Build Project编译项目,编译成功后,在工程libs->armeabi目录下可以看到libtest.so。

运行:在Package Explorer视窗,右键点击jni项目,选择Run As->Android Application运行工程。

最后,我们可以在logcat中可以看到打印结果:

Eclipse编译运行Native代码步骤详解相关推荐

  1. php5模块怎么下载,centos源码编译php5 mcrypt模块步骤详解

    步骤: 1.从php.net上面下载php5.3.x版本的源码; 2.centos安装相应的扩展包: 代码如下: yum install libmcrypt libmcrypt-devel mcryp ...

  2. Linux多线程并发运行原理+代码例程详解

    文章目录 线程创建和退出 原理 代码 结果 线程属性修改 原理 代码 结果 互斥锁 原理 代码 结果 信号量线程控制原理 使用信号量线程互斥 代码 结果 使用信号量线程同步 代码 结果 小结分析 &q ...

  3. 基于cubemx的OLED显示+程序下载+代码+步骤+详解

    在开头,我直接将cubemx的下载和取模软件下载链接发出来 飞猫盘|文件加速传输工具|云盘|橘猫旗下新概念云平台 飞猫盘|文件加速传输工具|云盘|橘猫旗下新概念云平台 大家可以通过我的链接下载,也可以 ...

  4. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    例子:由多个源文件组成的C程序,经过编辑.预处理.编译.链接等阶段才能生成最终的可执行程序.此过程中,在__c__阶段可以发现被调用的函数未定义. A. 编辑和预处理 B. 预处理 C. 编译 D. ...

  5. 如何用php新增税金一列_PHP计算个人所得税步骤详解(附代码)

    这次给大家带来PHP计算个人所得税步骤详解(附代码),PHP计算个人所得税的注意事项有哪些,下面就是实战案例,一起来看一下. 不使用速算扣除数计算个人所得税,PHP自定义函数实现个人所得税计算.使用速 ...

  6. Tomcat 项目代码上线步骤详解

    Tomcat 项目代码上线步骤详解 1.上线内容(JSP代码,图片,包文件(jar|war|ear)) 2.上线内容来源 a.开发人员提供(邮件形式).tar.gz 压缩包(包文件开发负责编译 编译命 ...

  7. notepad编译java_Notepad++直接编译运行java代码的具体步骤

    最近不少朋友表示还不会Notepad++直接编译运行java代码的操作步骤,使用下面小编就带来了Notepad++直接编译运行java代码的操作方法哦,一起去看看吧. Notepad++直接编译运行j ...

  8. 编译安装Nginx步骤详解

    编译安装Nginx步骤详解 1,去Nginx官方网站下载源码包并解压 curl -O 或wget 跟下载链接 tar -xf 解压 2,进入nginx解压后的目录执行./configure - ./c ...

  9. 二、SSM整合按步骤详解(清晰的思路加代码)从零开始一步步整合【二】(完结)

    接上一章节继续SSM整合按步骤详解(清晰的思路加代码)从零开始一步步整合[一] 上面讲了Spring和SpringMVC的整合,现在开始下一步,先来搭建一下MyBatis的环境 我们先来看看目录结构图 ...

最新文章

  1. centos7 安装 wireshark
  2. hdu 4667 Building Fence 计算几何模板
  3. C#获取文件夹下的所有文件的方法
  4. 基于JAVA+SpringMVC+MYSQL的学生信息管理系统
  5. 不可或缺的PrepareImageRegions函数
  6. linux网络调试发包抓包工具
  7. 面试题之__ 星际穿越(java实现)
  8. Mac老是自动关掉屏幕怎么办?
  9. 计算机组成原理课程设计报告 给出指令执行流程 add(二进制加法),计算机组成原理课程设计...
  10. 阿里云服务器采用AMD CPU处理器ECS实例规格详解
  11. Pillow的使用-Image篇
  12. centos1-修改ip地址、更换密码
  13. MySQL百万数据量如何快速查询。求教
  14. ssm+redis缓存配置
  15. 深度优先搜索是什么?
  16. POJ 1659-Frog's Neighborhood
  17. Java毕业设计——基于SSM的图书馆座位预约管理系统占座系统 / java图书馆座位预约管理系统占座系统
  18. Bugtags 与其它产品的区别
  19. VS编译出错:未能找到类型,未能加载基类
  20. 吉林大学设计模式第四次作业(上)

热门文章

  1. 单例模式(全局地提供了一个类的唯一对象,该类的对象只创建一次,避免了创建类对象的开销)
  2. 基于ECS部署LAMP环境实验记录
  3. html广告20s倒计时,一段广告倒计时退出代码
  4. TDD 与 CI 在 Python 中的实践
  5. SFB 项目经验-51-某上市企业2千人Exchange 2013升级2016高可用之伤01
  6. OTL调用Oracle存储过程
  7. 空调能窃听插座能放火?物联网成了“危”联网
  8. 高通的专利霸权要到头了?
  9. vue数据源转json问题
  10. MongoDB使用小结:一些常用操作分享