Android编译运行Native程序详解

来源:互联网 发布:数据库系统工程视频 编辑:程序博客网 时间:2024/06/05 20:56
最近闲来无事就研究了下Android如何编译运行Native程序,现在记录下来方便以后回顾。在进行Android开发的过程中,在一些对性能要求较高的场景,例如图像处理,视音频编解码等,需要使用到native代码以提高运行效率。
编译运行Native程序需要用到NDK(Native DevelopmentKit),和JDK类似的,熟悉Java都知道。
NDK的下载地址:https://developer.android.com/tools/sdk/ndk/index.html
下载完后解压,接下来就是见证奇迹的时刻:
1.配置NDK路径
打开Eclipse后,点击菜单栏的Project->Preferences打开Preferences窗口,点击左侧Android->NDK选项,在右侧NDKLocation填入ndk的路径。

2. 创建Android工程
这步比较简单,懂Android开发的都会,这里就不写了,这里我们创建一个jni的工程。
3.增加Native支持
创建完成后,在PackageExplorer中右键点击刚才新建的Android项目,选择Android Tools->AddNativeSupport,按下图填写,点击确认后,工程目录下会增加目录,目录下有test.cpp和Android.mk。



4.编写jave层的jni接口

创建一个Java类,类名为testJni

编写加载库的代码,并添加两个native方法

 

package com.lyc.testjni;public class testJni {      static {              System.loadLibrary("test");//加载库 libtest.so      }   public static native int plus(int a, int b);//对应nativeJava_com_mylzc_jni_Jni_plus函数   public static native String getString(String a, String b);//对应native层的Java_com_mylzc_jni_Jni_getString函数  }

5. 编写Native层的代码
#include #include "stdlib.h"extern "C" { jint Java_com_mylzc_jni_Jni_plus(JNIEnv *, jclass, jint x, jint y) {    return x + y;//返回x+y的结果 }   jstring Java_com_mylzc_jni_Jni_getString(JNIEnv *env, jclass, jstring a, jstring b){    const char* str_a = env->GetStringUTFChars(a, 0);    const char* str_b = env->GetStringUTFChars(b, 0);       int len_a = strlen(str_a);    int len_b = strlen(str_b);    //concat string    char* str_result = new char[len_a+len_b +1];    strcpy(str_result, str_a);    strcat(str_result,str_b);    jstring jstr_result = env->NewStringUTF(str_result);//创建string对象    delete[] str_result;    env->ReleaseStringUTFChars(a, str_a);    env->ReleaseStringUTFChars(b, str_b);        return jstr_result;//返回ab字符串连接之后的结果 }}

6.编写Android.mk
LOCAL_PATH := $(call my-dir)  #指定源文件目录include $(CLEAR_VARS) #清空变量LOCAL_MODULE    := test  #模块名称,对应编译出libtest.soLOCAL_SRC_FILES := test.cpp #指定要编译的源文件include $(BUILD_SHARED_LIBRARY) #指定编译动态链接库
7.编译运行

编译:在Package Explorer视窗,右键点击jni项目,选择BuildProject编译项目,编译成功后,在工程libs->armeabi目录下可以看到libtest.so。


运行:在Package Explorer视窗,右键点击jni项目,选择Run As->AndroidApplication运行工程。

最后,我们可以在logcat中可以看到运行打印的结果。

至此整个程序就结束。




0 0