Eclipse编译运行Native代码步骤详解

来源:互联网 发布:淘宝质量好的皮鞋店 编辑:程序博客网 时间:2024/06/06 19:22

最近一段时间在做native层的开发,把一些经验和技巧记录下来,希望对大家有帮助。本教程以step-by-step的形式给正处入门阶段的native开发新手提供指引。


导言:在进行Android开发的过程中,在一些对性能要求较高的场景,例如图像处理,视音频编解码等,需要使用到native代码以提高运行效率。本教程将在native层进行加法运算和字符串连接,通过这个简单的例子阐述使用eclipse编译运行ndk代码的过程。

注:JNI基础知识不在本文的讨论范围之内,推荐浏览oracle的帮助文档进行系统学习


开发环境:

Adt-bundle(ver:21.1.0) 下载地址:https://developer.android.com/sdk/index.html

Ndk(ver:r8b) 下载地址:https://developer.android.com/tools/sdk/ndk/index.html

示例工程下载地址:https://github.com/ilzc/Code/tree/master/jni


步骤详解:

1、  配置ndk路径

打开Eclipse后,点击菜单栏的Project->Preferences打开Preferences窗口,点击左侧Android->NDK选项,在右侧NDK Location填入ndk的路径



2、  创建工程并增加native支持

点击菜单栏的File->New->Android Application Project创建Android工程。


创建完毕后,在PackageExplorer中右键点击刚才新建的Android项目,选择Android Tools->Add Native Support,按下图填写,点击确认后,工程目录下会增加jni目录,jni目录下有test.cpp和Android.mk。





3、  编写jave层的jni接口

创建一个Java类,类名为Jni

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

 

[java] view plaincopy
  1. package com.mylzc.jni;  
  2.   
  3. public class Jni {  
  4.     static {  
  5.         System.loadLibrary("test");//加载库 libtest.so  
  6.     }  
  7.     public static native int plus(int a, int b);//对应native层的Java_com_mylzc_jni_Jni_plus函数  
  8.     public static native String getString(String a, String b);//对应native层的Java_com_mylzc_jni_Jni_getString函数  
  9. }  


4、  编写native层的代码

 

[cpp] view plaincopy
  1. #include <jni.h>  
  2. #include "stdlib.h"  
  3.   
  4. extern "C" {  
  5. jint Java_com_mylzc_jni_Jni_plus  
  6.   (JNIEnv *, jclass, jint x, jint y) {  
  7.     return x + y;//返回x+y的结果  
  8. }  
  9.   
  10. jstring Java_com_mylzc_jni_Jni_getString  
  11.   (JNIEnv *env, jclass, jstring a, jstring b) {  
  12.   
  13.     const char* str_a = env->GetStringUTFChars(a, 0);  
  14.     const char* str_b = env->GetStringUTFChars(b, 0);  
  15.   
  16.     int len_a = strlen(str_a);  
  17.     int len_b = strlen(str_b);  
  18.   
  19.     //concat string  
  20.     char* str_result = new char[len_a+len_b +1];  
  21.     strcpy(str_result, str_a);  
  22.     strcat(str_result,str_b);  
  23.     jstring jstr_result = env->NewStringUTF(str_result);//创建string对象  
  24.     delete[] str_result;  
  25.   
  26.     env->ReleaseStringUTFChars(a, str_a);  
  27.     env->ReleaseStringUTFChars(b, str_b);  
  28.   
  29.     return jstr_result;//返回ab字符串连接之后的结果  
  30. }  
  31. }  


5、  编写Android.mk

[html] view plaincopy
  1. LOCAL_PATH := $(call my-dir)  #指定源文件目录  
  2.   
  3. include $(CLEAR_VARS) #清空变量  
  4.   
  5. LOCAL_MODULE    :test  #模块名称,对应编译出libtest.so  
  6. LOCAL_SRC_FILES :test.cpp #指定要编译的源文件  
  7.   
  8. include $(BUILD_SHARED_LIBRARY) #指定编译动态链接库  



6、  编译运行

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


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

最后,我们可以在logcat中可以看到打印结果:

原创粉丝点击