Android NDK开发入门(一)

本文详细介绍如何使用 Android NDK 进行开发,包括下载安装 NDK、创建项目、添加动态库、实现 C 代码等功能模块,并提供了一个计算器示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中需要用到NDK开发。使用NDK开发的原因有两个,首先,可以防止人家反编译,底层毕竟都是c或者c++写的,其次,效率要高一些。作为基础篇,我尽量讲得详细一下。

首先需要去android官网去下载NDK开发包。如我下载的开发包。android-ndk-r10c.zip,可能不是最新的,我是去年下载的。

1. 通过eclipse创建一个NDKExample的项目。通过eclipse的菜单window->Preferences->Android 配置android-ndk-r10c.zip解压以后的路径。如图:

2. 添加动态库(*.so).

右击项目->Android Tools->Add Native Support...。出现如图界面:

可以修改so库的名称。Finish以后,就会增加JNI的文件。



内部有一个*.cpp文件,和一个makefile文件。

3. 在项目写一个Calculator计算器的类,这个类负责去调用c写成的函数。代码如下:

/**
 * 计算器
 * @author Administrator
 *
 */
public class Calculator {
	
	/**
	 * 加载c写的动态库
	 */
	static{
		System.loadLibrary("NDKTest");
	}
	
	public native int add(int a, int b);
	public native int sub(int a, int b);
	
}

4. 使用javah工具生成Calculator对应的头文件。

在windows平台上cmd进入该项目路径的src路径,比如我的路径为F:\workspace\android_svn\NDKExample\src。然后在命令行下使用:javah com.example.ndkexample.Calculator生成头文件。将头文件拷贝到JNI路径下。

拷贝过来以后,可能会报错,需要引用JNI.h头文件。项目右击属性->c/c++ General Path and Symbols->include -> add 选择NDK安装所在的路径include的,比如我的:D:\android-ndk-r10c\platforms\android-8\arch-arm\usr\include。

5. 具体实现c代码。

请注意使用javah生成的头文件时基于c语音的,如果是c++的话,还需要做一些处理,我将会在后续课程中介绍。

代码如下:

#include <jni.h>
#include "com_example_ndkexample_Calculator.h"

JNIEXPORT jint JNICALL Java_com_example_ndkexample_Calculator_add
  (JNIEnv * env, jobject obj, jint a, jint b){
	return a + b;
}


JNIEXPORT jint JNICALL Java_com_example_ndkexample_Calculator_sub
  (JNIEnv * env, jobject obj, jint a, jint b){
	return a - b;
}
修改android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := NDKTest
LOCAL_SRC_FILES := NDKTest.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE: 表示so库的名称。

LOCAL_SRC_FILES:所有的c文件。


6. 看看java的层的处理。在含有native方法的这个类中需用使用

/**
* 加载c写的动态库
*/
static{
System.loadLibrary("NDKTest");
}

加载类库,其余的方式和普通的类是一样的。


7. 写一个测试代码,去调用add和sub方法。

	final Calculator cal = new Calculator();
		final EditText et1 = (EditText) findViewById(R.id.et_num1); 
		final EditText etOper = (EditText) findViewById(R.id.et_oper); 
		final EditText et2 = (EditText) findViewById(R.id.et_num2); 
		
		Button btn= (Button) findViewById(R.id.btn_ok);
		btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				int num1 = Integer.parseInt(et1.getText().toString().trim());
				int num2 = Integer.parseInt(et2.getText().toString().trim());
				
				String oper = etOper.getText().toString().trim();
				if (oper.equals("+")){
					int result = cal.add(num1, num2);
					Toast.makeText(getApplication(), "result = " + result, 0).show();
				}else{
					int result = cal.sub(num1, num2);
					Toast.makeText(getApplication(), "result = " + result, 0).show();
				}
			}
		});
代码很简单,就不废话了。


代码下载地址为:下载

本篇博客为基础入门篇,后续会深入讲解。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值