随便谈谈为什么要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. */
@Override
public 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

基于 Android NDK 的学习之旅-----Java 调用C的更多相关文章

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

    许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态 ...

  2. 基于 Android NDK 的学习之旅----- Java 方法映射到C中的签名

    刚接触JNI 的 兄弟在看一些demo的时候 发现有类似与“([Ljava/lang/String;)V”的东西的时候肯定会很“蛋疼”,完全不懂这是啥东西,怎么来的,有啥用处? 今天就讲讲这个“蛋疼” ...

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

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

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

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

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

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

  6. 基于 Android NDK 的学习之旅-----HelloWorld

    Hello World作为所有编程语言的起始阶段,占据着无法改变的地位,所有中/英/法/德/美……版本的编程教材中,hello world总是作为第一个TEST记录于书本之中,所有的编程第一步就在于此 ...

  7. 基于 Android NDK 的学习之旅-----JNI LOG 打印

    程序都是调出来的. 下面我介绍下JNI层的log打印方法的使用,类似与Android sdk提供的log 1.Android 应用层 MainActivity.java 主要功能代码 a)       ...

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

    接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String 字符串传输 a)         上层定义一个native的方法,需要一个 ...

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

    做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概念(GC直接帮忙回收),后查询原因才知道是因为JNI 有些对 ...

随机推荐

  1. JavaScript的字符串、数组以及DOM操作总结

    (一)JavaScript字符串操作 JavaScript的字符串就是用' '或" "括起来的字符表示,日常的学习中有时候需要对字符串进行相关的操作.例如要获取字符串某个指定位置的 ...

  2. Direct2D开发:MFC下从资源文件中加载位图

    转载请注明出处:http://www.cnblogs.com/ye-ming 0X01 概述: 相对于GDI处理界面,Direct2D有得天独厚的优势,下图就是Direct2D与GDI的效果对比,wi ...

  3. 数据类型的提升(promotion)

    假如参与运算的数据类型不同或者取值范围过小,编译器会自动将其转换为相同的类型,这个类型就叫数据类型的提升(promotion). 1. C++ 语言环境的规定 unsigned char a = 17 ...

  4. 3.十分钟读懂——App开发规范的业务流程

    转自:http://www.itdaan.com/blog/2017/12/08/6bc06b3387a8d1238504355a6a1c6743.html 一.主要流程   二.产品立项 工作概述: ...

  5. subline Text3 安装及汉化

    因为自己的subline 有问题  所以决心重新改一下了. 三步: http://www.sublimetext.com/3      官网下载subline3 https://www.imjeff. ...

  6. 洛谷 P1727 计算π

    P1727 计算π 题目背景 <爱与愁的故事第二弹·compute>第一章. 题目描述 中秋至,博饼声铿锵不断.爱与愁大神兴致勃勃地到学校博饼,结果抱回家的只有一秀二举.爱与愁大神十分生气 ...

  7. iCarousel——在iOS和Mac OS应用中实现3D CoverFlow旋转木马效果的开源类库

    前言 iCarousel一个简单.可高度定制的3D CoverFlow开源类库,旨在简化在 iPhone, iPad和Mac OS中生成各种类型的cover flow(视图切换)效果(分页.滚动视图) ...

  8. StackExchange.Redis 官方文档(六) PipelinesMultiplexers

    原文:StackExchange.Redis 官方文档(六) PipelinesMultiplexers 流水线和复用 糟糕的时间浪费.现代的计算机以惊人的速度产生大量的数据,而且高速网络通道(通常在 ...

  9. AUC(Area Under roc Curve )计算及其与ROC的关系

    转载: http://blog.csdn.net/chjjunking/article/details/5933105 让我们从头说起,首先AUC是一种用来度量分类模型好坏的一个标准.这样的标准其实有 ...

  10. C#复习题

    1.以下(D )不是 C#中方法的參数的类型. A.值类型B.引用型C.输出型D.属性 2.C#中的数据类型分为值类型和引用类型,以下(B )不属于引用类型. A.类 B.枚举 C.接口 D.数组 3 ...