[Google Android] 理解NDK(1)-- 编译Android .so文件

    技术2022-05-20  36

    /** 转载必须标明出处*/

    说白了就是c代码做成动态库,被java代码调用(JNI)。用C写不出可以直接在Android上跑的可执行程序来。

    NDK开发需要一个交叉编译环境,需要安装Cygwin, NDK。

    这些准备工作就不说了网上很多,当然也可以问我。

    讲一下.so文件的生成

    --------------------------------------------------------------------------------------------------------------------------------------------------

     

     

    编译Android .so文件

     

    <!--[if !supportLists]-->1.       <!--[endif]-->定义native接口

    创建一个Android的项目 “ndk_plus”,添加一个JNI类。

           <!--[endif]-->

                1AndroidSDK项目

    // JNI.java  Code:

    package kun.ndk.plus; public class JNI { public native int plus( int a, int b);}

     

    <!--[if !supportLists]-->2.       <!--[endif]-->根据JNI.java文件生成相应的.h文件

    cmdndk_plus项目的bin目录,然后执行 javah –classpath . –jni kun.ndk.plus.JNI

    这样就会生成kun_ndk_plus_JNI.h头文件。内容如下:

     

    代码 /* DO NOT EDIT THIS FILE - it is machine generated */ #include < jni.h > /* Header for class kun_ndk_plus_JNI */ #ifndef _Included_kun_ndk_plus_JNI #define _Included_kun_ndk_plus_JNI #ifdef __cplusplus extern " C " { #endif /* * Class: kun_ndk_plus_JNI * Method: plus * Signature: (II)I */ JNIEXPORT jint JNICALL Java_kun_ndk_plus_JNI_plus (JNIEnv * , jobject, jint, jint); #ifdef __cplusplus} #endif #endif

     

     

    如果提示没有javah命令,则需要找到javah.exe所在目录(C:/Program Files/Java/jdk1.5.0/bin),并把这个目录添加到环境变量 PATH里。

    <!--[if !supportLists]-->3.       <!--[endif]-->根据.h文件实现相应的.c文件

    Eclipse(其它编辑工具均可)里创建kun_ndk_plus_JNI.c文件

    //-------------------------------------------------------------------------------------------------------------

    #include <jni.h>

    #include "kun_ndk_plus_JNI.h"

    JNIEXPORT jint JNICALL Java_kun_ndk_plus_JNI_plus

      (JNIEnv *e, jobject j, jint a, jint b)

      {

    return a + b;

      }

     

    //-------------------------------------------------------------------------------------------------------------

    注意红色部分。由于生成的.h中的函数声明并没有形参,实现时需要自己添加形参变量。

    还要注意的是要在蓝色的大括号后面添加一个回车(gcc 编译器的特点)

    <!--[if !supportLists]-->4.       <!--[endif]-->制作.mk文件

    NDK目录下的apps目录下新建plus文件夹,在这个文件夹下创建一个txt文件,

    输入一下内容:

    APP_PROJECT_PATH := $(call my-dir)

    APP_MODULES := plus

    并重命名为Application.mk

            NDK/sources/samples目录下新建plus文件夹, 在这个文件夹下创建一个txt文件,输入以下内容:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := plus

    LOCAL_SRC_FILES := kun_ndk_plus_JNI.c

    include $(BUILD_SHARED_LIBRARY)

    并重名名为Android.mk。把.c.h文件拷贝到这个文件夹下。

    //关键字具体含义看doc/ OVERVIEW.TXT

     

    <!--[if !supportLists]-->5.       <!--[endif]-->编译

    启动Cygwin, cdNDK目录

    make APP=plus

    <!--[endif]-->

    成功后会在apps/plus/libs/armeabi下有一个libplus.so文件。

    6.  后面就是把.so文件加到Android工程中在java代码中使用了。

     

    转自 http://www.cnblogs.com/tamer/archive/2011/01/18/1938307.html


    最新回复(0)