美文网首页Android知识程序员Android开发
总结一下Eclipse环境下用NDK编译JNI使用的.so库的详

总结一下Eclipse环境下用NDK编译JNI使用的.so库的详

作者: 小甜妮子__ | 来源:发表于2017-04-24 16:30 被阅读600次

    总结一下Eclipse环境下用NDK编译JNI使用的.so库的详细步骤:

    1.下载NDK(注意区分32位/64位系统);
    2.解压NDK到任意目录(最好没有中文,有中文是否可用没有测试过);
    3.配置NDK环境变量:
    将NDK解压路径添加到高级系统设置-->系统变量-->Path中(例如我的ndk路径:D:\android-ndk32-r10b-windows-x86\android-ndk-r10b);
    4.Eclipse中配置NDK:
    Window-->Preferences-->Android-->NDK,添加NDK Location(同上路径);
    5.创建JNI Android工程:
    1)编写native方法:
    <pre>
    public class FirstJni{

    public native String fromJniStr();
    
       // 使用loadLibrary加载so文件,加载的时候不需要写lib
    static{
        System.loadLibrary("first-jni");
    }
    

    }
    </pre>

    2)生成头文件
    用命令行方式进入工程目录的bin\classes目录下-->javah com.example.j_one.FirstJni-->生成com_example_jone_FirstJni.h文件;
    <pre>
    /* DO NOT EDIT THIS FILE - it is machine generated */

    include <jni.h>

    /* Header for class com_example_jone_FirstJni */

    ifndef _Included_com_example_jone_FirstJni

    define _Included_com_example_jone_FirstJni

    ifdef __cplusplus

    extern "C" {

    endif

    /*

    • Class: com_example_jone_FirstJni
    • Method: fromJniStr
    • Signature: ()Ljava/lang/String;
      */
      JNIEXPORT jstring JNICALL Java_com_example_jone_FirstJni_fromJniStr
      (JNIEnv *, jobject);

    ifdef __cplusplus

    }

    endif

    endif

    </pre>

    该头文件需要使用的是根据Java中native方法所生成的C方法名称。命名规则为:
    Java_(固定开头)com_example_jone(用"_"连接的包名)_FirstJni(类名)_fromJniStr(函数名)

    3)创建jni文件夹,编写C文件
    <pre>

    include <string.h>

    include <jni.h>

    jstring Java_com_example_jone_FirstJni_fromJniStr( JNIEnv* env, jobject thiz )
    {
    return (*env)->NewStringUTF(env, "Message from First JNI !");
    }
    </pre>

    4)编写Android.mk文件
    <pre>
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := first-jni #表示将要生成一个名称为libhello-jni.so的库文件
    LOCAL_SRC_FILES := first-jni.c #表示生成库文件的源文件是hello-jni.c
    include $(BUILD_SHARED_LIBRARY) #表示会生成一个动态链接库,即so文件,生成的库文件名称为lib*.so
    </pre>

    6.新建并配置一个新的Builder
    1) 点击Project->Properties->Builders->New,新建立一个Builder。在弹出的对话框上面点击Program,点击OK;
    2) 在弹出的对话框【Edit Configuration】中,配置选项卡【Main】:
    Location中需要填入nkd-build.cmd的路径(NDK安装目录下)。
    WorkingDiretcoty中需要填入HelloJni的工程根目录。
    3) 在【EditConfiguration】中,配置选项卡【Refresh】:
    勾选“Refresh resources upon completion”,
    勾选“The entire workspace”,
    勾选“Recuresively include sub-folders”。
    4)在【EditConfiguration】中,配置选项卡【Build Options】:
    勾选“After a “Clean””,
    勾选“During manual builds”,
    勾选“During auto builds”,
    勾选“Specify working set of relevant resources”。
    点击“Specify Resources…”勾选TestNDK工程的“jni“目录,Finish!
    保存设置,点击OK。

    7.生成so文件
    由于我们勾选了“During auto builds”,所以在工程有所改变的时候,so文件便会自动编译,正确生成以后就能在工程目录下发现多了两个文件夹,文件夹libs\armeabi目录下生成了一个叫libfirst-jni.so的文件。至此,使用NDK生成so文件的工作就完成了。

    相关文章

      网友评论

        本文标题:总结一下Eclipse环境下用NDK编译JNI使用的.so库的详

        本文链接:https://www.haomeiwen.com/subject/izrpzttx.html