Android平台下NDK开发实例

搞Android开发也有很长一段时间了,但基本上都是搞应用开发为主,还没接触过NDK,最近按照网上的介绍安装NDK开发环境,自己也来体验一把,以方便自己以后查阅。

关于安装和配置Android NDK开发环境的Blog网上有一大堆了,我就不在写了。

1.Android NDK安装好了之后,在安装目录(如:D:\android-ndk-r7)下新建一个apps目录用于存放工程;

2.在apps目录下新建一个MyFirstNdkDemo目录;

3.打开Eclipse开发工具,新建一个Android工程,工程很简单,就是编写一个函数计算两个数的乘积,取消“Create Project in Workspace”勾选,选择浏览定位到刚刚新建的MyFirstNdkDemo目录。

public class MyFirstNdkDemo extends Activity
{
 private TextView tView = null;
 private Button button = null;

 public native int multiplication(int a, int b);
 
 static 
 {
  System.loadLibrary("MyFirstNdkDemo");
 }

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  tView = (TextView) findViewById(R.id.tv);
  button = (Button) findViewById(R.id.btn);
  button.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    // TODO Auto-generated method stub
    tView.setText(String.valueOf(multiplication(2, 3)));
   }
  });
 }
}


4.编译Android工程后,打开命令提示符,进入到bin\classes(如:D:\android-ndk-r7\apps\MyFirstNdkDemo\bin\classes)目录下,使用javah工具生成头文件(.h),

命令如下:javah -classpath . -d jni com.example.myfirstndkdemo.MyFirstNdkDemo。

如果没有产生异常的话,在class目录下回生成一个jni目录,里面就是我们需要的头文件。将该目录(jni)移动到我们的工程目录下,即MyFirstNdkDemo目录下。

PS:如果提示找不到javah命令的话,说明环境变量没有配置好,javah.exe工具位于JDK安装目录的bin目录下。

 5.在工程目录(MyFirstNdkDemo)下新建Application.mk文件,内容如下:

APP_PROJECT_PATH:=$(call my-dir)
APP_MODULES :=MyFirstNdkDemo

说明:Application.mk文件是用来声明Android工程需要调用的非托管模块(如静态库或共享库)。第一行变量APP_PROJECT_PATH表示Android工程所在的目录。在生产共享库文件后,apk将自动将共享库文件拷贝到Android工程\libs\armeabi目录中。第二行变量APP_MODULES表示Android工程需要调用的非托管模块。

6.在jni目录下新建C源文件和Android.mk,C代码源文件名和对应的头文件同名,代码如下:

 

#include <stdlib.h>
#include <stdio.h>
#include "com_example_myfirstndkdemo_MyFirstNdkDemo.h"

JNIEXPORT jint JNICALL Java_com_example_myfirstndkdemo_MyFirstNdkDemo_multiplication
  (JNIEnv *env, jobject thiz, jint a, jint b)
{
 return (a * b);
}


Android.mk文件内容如下:

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=MyFirstNdkDemo
LOCAL_SRC_FILES :=com_example_myfirstndkdemo_MyFirstNdkDemo.c
include $(BUILD_SHARED_LIBRARY)

完成以上步骤后,在jni目录下有一下3个文件

PS :使用javah生成的头文件中,函数的声明中,参数可能只有类型名,没有给出形参,这将导致后面使用Cygwin编译时报错,不能通过编译,在C代码中实现函数时需要手动为函数添加形参。


7.启动Cygwin,进入到工程目录下,NKD编译系统会首先找到目录中的Application.mk文件,根据Application.mk文件的信息,确定该Android共享需要使用的APP_MODULES模块;然后在jni目录中搜索所有Android.mk文件,在找到与APP_MODULES模块匹配的Android.mk文件后,根据Android.mk文件提供的信息编译指定的C/C++ 源代码文件,形成共享库文件;最后将生产的共享库文件(*.so)拷贝到Android工程的指定目录(libs)中。

输入$NDK/ndk-build命令。

编译完成后会在我们的工程目录下生成libs目录和obj目录,生成的libMyFirstNdkDemo.so共享库位于libs\armeabi目录下,刷新Android工程,将在libs\armeabi目录下看见我们的共享库

8.至此,我们的简单NDK实例就完成了,接下了就是在模拟器中运行我们的程序了。

注意:在Java代码的static静态语句块中的System.loadLibrary("MyFirstNdkDemo");,参数是生成的so文件的文件名,但不包括前缀lib和后缀.so。


 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页