基于 Android NDK 的学习之旅-----Java 调用C

随便谈谈为什么要Java调用C 吧:

我认为:

1、  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所以我们没必要同样的功能又在java中实现一遍。例如我之前做的一个项目,公司C引擎已经很成熟了,所以直接在java中封装好接口,由C去实现。

2、  C的速度一般是java的10-20倍把,有些对速度要求高的就需要在C中实现。例如我以前在Android项目中有要求批量(10000++)生成MD5的值,由于测试对java中直接生成的效果不满意,所以后面就换成C去实现了。

3、 …..

不罗嗦了,直接开始吧。

1、主要流程

a)       Java声明本地接口 add(int x, int y)

b)      C 中 实现 add(int x,int y)

c)       JNI中 java方法调用C 中的 add(int x,int y),并把结果返回

d)      Android 上层显示结果

2、设计实现

1、界面设计如下:

比较搓一点,大家别见笑(嘎嘎),代码不贴了,兄弟们可以直接下载整个工程

2、  Android 上层关键代码

public native int add(int x, int y);

该方法就是 要让 C 实现的本地方法。

MainActivity.java

package com.duicky;

import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;

/** * Java 调用 C 例子  *  * @author luxiaofeng <454162034@qq.com> **/public class MainActivity extends Activity {//也就是你mk配置文件中的  LOCAL_MODULE    := NDK_03    private static final String libSoName = "NDK_03";private static final String tag = "MainActivity";

private Context mContext = null;private Button btnClick = null;private String mStrMSG = null;private EditText etX = null;private EditText etY = null;private EditText etResult = null;

private int x = 0 ;private int y = 0 ;

/** Called when the activity is first created. */    @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.main);

        mContext = this;//初始化控件        initViews();    }

/**     * 初始化控件*/private void initViews() {        etX = (EditText)findViewById(R.id.et_x);        etY = (EditText)findViewById(R.id.et_y);        etResult = (EditText)findViewById(R.id.et_result);        btnClick = (Button) findViewById(R.id.btn_click);        btnClick.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

if(getX() && getY()){int result = add(x,y);                    LogUtils.printWithLogCat(tag,x+" + " + y + " = " +result);                    etResult.setText(String.valueOf(result));                } else {                    etX.setText("");                    etY.setText("");                    etResult.setText("");                    LogUtils.toastMessage(mContext, "请输入正确的值");                }

            }        });

    }

/**     * 获取x*/private boolean getX() {        String str = etX.getText().toString().trim();try {            x = Integer.valueOf(str);        } catch(NumberFormatException e) {return false;        }return true;    }

/**     * 获取y*/private boolean getY() {        String str = etY.getText().toString().trim();try {            y = Integer.valueOf(str);        } catch(NumberFormatException e) {return false;        }return true;    }

/**     * 该方法为native方法.     *      *         实现加法功能     *      * @param x    加数     * @param y 加数     *      * @return x+y 的结果*/public native int add(int x, int y);

/**     * 载入JNI生成的so库文件*/static {        System.loadLibrary(libSoName);    }

}

  

3、  Android.mk 文件 关键代码

LOCAL_MODULE    := NDK_03

LOCAL_SRC_FILES := \

JavaToC.c \

Operate.c

不说了,你懂的。 如果不懂,嘎嘎,那就请点击Android.mk 文件 简介

4、  JNI文件夹下文件

Operate.h

#include <string.h>

#include <jni.h>

int add(int x, int y);

  

Operate.c

#include "Operate.h"

/**

 * C 实现的 加法

*/

int add(int x, int y) {

return x+y;

}

  

JavaToC.c

#include <string.h>

#include <android/log.h>

#include <jni.h>

#include "Operate.h"

/**

 *  Java 中 声明的native add 方法的实现

 *

 *  jint x       参数X

 *  jint y       参数Y

*/

jint Java_com_duicky_MainActivity_add(JNIEnv* env, jobject thiz,

        jint x,jint y)

{

//该方法为打印的方法

__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Get Param:  x=%d y=%d ", x,y);

return add(x,y);

}

  

3、运行效果

输入两个数字,调用C方法得出结果

  

JNI层获取到参数打印出来

本章节只做简单Java 调用 C 入门介绍 , 以后的一些文章 会详细说明 Java JNI C 层之间的数据传输问题。

你懂了吗? 无论你懂不懂,反正我是懂了(嘎嘎,太邪恶了)

有不理解的兄弟请留言,个人技术有限,有讲错的地方请大牛们指出,讲的不够全面的请多多包涵,谢谢,

点击下载源码 java调用C例子

欢迎转载,请注明出处  http://www.cnblogs.com/luxiaofeng54/archive/2011/08/15/2139934.html

转载于:https://www.cnblogs.com/luxiaofeng54/archive/2011/08/15/2139934.html

基于 Android NDK 的学习之旅-----Java 调用C(附源码)相关推荐

  1. 基于 Android NDK 的学习之旅----- C调用Java

    2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...

  2. 基于 Android NDK 的学习之旅-----资源释放

    基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...

  3. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  4. 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码)

    基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String ...

  5. 基于 Android NDK 的学习之旅-----序言

    前些日子做了个Android项目, 引擎层用C的, 准备写这个系类的文章,借此跟朋友来分享下我NDK开放的经验以及自己知识的总结和备忘.希望能给需要这方面资料的朋友提供一定的帮助. 主要涉及到:  环 ...

  6. 基于 Android NDK 的学习之旅-----环境搭建

    工欲善其事 必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环境搭建 Android开发环境搭建不是重点,相信看此文章的 ...

  7. 基于Android社区生鲜O2O订购系统设计与实现 毕业设计-附源码231443

    社区生鲜O2O订购系统app 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区生鲜O2O订 ...

  8. 基于 Android NDK 的学习之旅-----JNI 数据类型

    经典老套流程,学编程语言东西,先学它最基础的数据类型,JNI也是如此.JNI 定义了一系列基本数据类型和引用数据类型与java想对应. 1.基本数据类型 下面一张表是描述了 Java 基本数据类型和J ...

  9. 基于Android Studio实现的功能强大的购物商城APP源码,可做Android Studio毕业设计、大作业

    Android 购物商城app 完整代码下载地址:基于Android Studio实现的功能强大的购物商城APP源码 实现的功能: 注册 登录 修改密码 重置密码(邮箱验证,考核结束将移除授权码) 商 ...

最新文章

  1. 设置EditText自动获取焦点并弹出输入法
  2. 国内外开源与 SaaS ,团队协作平台、项目管理工具整理
  3. python里保存图片_python保存图片报错?
  4. javascript嵌套的对象被修改时log不符合的问题
  5. Python练习 | 初识Python、数据类型、基本语句
  6. Web站点下的Web Service读取此Web站点中的Session值
  7. java undo_用JAVA实现Undo、Redo,Copy、Paste、Cut_java
  8. 菜鸟技术专家胡斌:技术架构的战略和战术原则
  9. mysql 存在更新不存在写入_梅姨这个人,到底存在不存在?
  10. 总结2-深度学习网络搭建学习
  11. Ubuntu 13.10 软件更新源列表
  12. sql按照字符串格式拼接
  13. 多旋翼智能飞行和视觉识别(H题)(组委会自命题)
  14. 数字化大时代崛起的数据安全能力框架
  15. 点击计算机 不支持此接口
  16. 共阳极数码管编码表_LED数码管你知道多少?
  17. Laravel 5.7用户注册邮箱激活的功能演示
  18. python核心编程 第3版_Python核心编程(第3版)PDF高清晰完整中文版
  19. 计算机研究生论文期刊,经典计算机研究生小论文参考文献 计算机研究生小核心期刊参考文献哪里找...
  20. 美国计算机科学排,美国大学计算机科学computer science专业排名

热门文章

  1. A Walk Through the Forest dijkstra(邻接矩阵)
  2. DNS IP DOMAIN 详解
  3. (100)FPGA RAM实现(V实现)
  4. (13)Verilog HDL变量:memory型
  5. 高级定时器的各种框图和HAL库重要结构
  6. 文件和内建函数 open() 、file()
  7. 1003.imx6Q自启动脚本
  8. endp 汇编start_常见汇编代码
  9. python算法应用(八)——优化
  10. linux下ip协议(V4)的实现(一)