随便谈谈为什么要 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

更多相关文章

  1. Qt for Android(安卓)集成史上第一最全最简单的微信支付
  2. Android事件管理源码剖析
  3. 【Android】Android中WebView实现Java与JS交互
  4. android 空调遥控器——红外设备(基础)
  5. android回调机制总结
  6. Android用AsyncTask来下载图片及用AsyncTask的好处
  7. Android(安卓)如何获取应用签名,微信需要的签名是MD5还是SHA1?
  8. 当你说不行时,你应该说些什么:以Android播放midi为例
  9. 作为Android开发者 你真的知道app从启动到主页显示的过程吗?

随机推荐

  1. Android开源图表库XCL-Charts版本号公布
  2. android本地化和国际化
  3. Android(安卓)studio异常记录
  4. Android: 获取当前线程状态
  5. Mac 进行 android 真机调试
  6. android给图片添加边框
  7. Android(安卓)DownloadManager的用法
  8. android UI 设计之 Tabs
  9. Android聊天背景图片变形解决方案
  10. Android(安卓)VSYNC详解