• android Jni NDK开发环境搭建及其简单实例的编写


     android  Jni  NDK开发环境搭建及其简单实例的编写

                       由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下。遇到了些问题,然后总结下学习过程中的问题和开发流程

    首先、Jni我的理解,属于一个中间的东西,如果把只做linux 的话,他就是linux的应用程序,但是如果做安卓的话,它就是中间层了(用于java语言调用C语言的接口)。我们说说

    开发JNI的开发环境的搭建吧。

    第一:我们用windows平台开发

    准备工作:

        1、我们安卓开发都需要的elipse ,包括SDK,首先要能够开发APK软件。

        2、 我们需要一个如同linux 的环境,需要编译的环境,我们采用Cygwin(注意:1.7版本以上),否则不行。

        3 、我们需要NDK工具包,可以通过安卓官网下载

    1.1、cygwin的安装

    下载地址:http://www.cygwin.com/

    也可以选择我下载好的地址:http://pan.baidu.com/s/1b1UQE

    1.1.1、  可以选择从网上下载最新的安装也可以选择我下载好的安装

    1.1.2、  双击cygwin1.7.1/cygwin1.7.1.exe  选择Install form LocalDirectory

    1.1.3、  选择安装的路径

    1.1.4、  选择的下载之后的路径tmp

    1.1.5、  点击下一步直到安装完成。

    1.1.6、双击桌面的图标,看是否能够进去。有没有问题(输入gcc 等命令)。

    1.2、Android的NDK安装

    下载地址:http://developer.android.com/tools/sdk/ndk/index.html

    1.2.1、将android-ndk-r9b-windows-x86.zip解压到任意目录(记住即可)

    如:E:androidandroid-ndk-r9b

    1.2.2、设置环境变量(有的方法是通过/home/.bashrc设置的也可以),我就直接设置。右键点击我的电脑-属性(选择高级选项卡,点击环境变量设置),然后选择新建

    1.2.3、重新关掉cygwin,然后打开,输入ehco$ndk 看是否显示E:androidandroid-ndk-r9b目录,如果可以则设置成功

    1.2.4、编译一个简单的实例 如下图,如果生成*.so 就说明没有问题。

    第二:安卓JNI实例说明

    1、  用eclips 新建一个android 工程

    2、  修改Activity

    2.1 加入:

    static {

            //注意你生成的库文件名称(如libhellojni.so,去掉lib.so即可。

           System.loadLibrary("hellojni");

          

        }

    2.2加入:

        /*

         * JNI中的方法

         * */

        public static native int open(int fd);

        public static native int close(int fd);

        public static native String read();

    2.3 添加一个按钮:在onCreate方法中

           Button tb=(Button)findViewById(R.id.button1);

              tb.setOnClickListener(new OnClickListener() {

               public void onClick(View v) {

                     /*调用Jni

                      */

                  open(2); 

                  close(2);

                  tv.setText(read());//修改文本框中的内容

               }});

    3、  通过javah生成.h文件(用于编译jni的程序)

    3.1 切换到项目目录

    #cd "C:Documents and SettingsgonglinyuanworkspaceHelloJni"

    #cd ./bin/class

    3.2 执行java –h命令

    #javah -jni com.cem.hellojni.HelloActivity

    4、  编写jni代码

    4.1、在工程目录中建立jni文件夹

    #mkdir jni

    #cp  ./bin/class/com_cem_hellojni_HelloActivity.h ./jni

    4.2、刷新eclipse的目录,新建com_cem_hellojni_HelloActivity.c 文件,实现头文件中的代码,如下面代码

    #include <string.h>

    #include <jni.h>

     

    #include "android/log.h"

    #include "com_cem_hellojni_HelloActivity.h"

     

     

    static const char *TAG="Hello_module";

    char buf[]="icegoly";

     

    #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,  TAG, fmt,##args)

    #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt,##args)

    #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt,##args)

     

     

    JNIEXPORT jint JNICALL Java_com_cem_hellojni_HelloActivity_open

      (JNIEnv *env, jclass jc, jint fd)

    {

     

        LOGD("Jni open ing ");

        return 0;

     

    }

    JNIEXPORT jint JNICALL Java_com_cem_hellojni_HelloActivity_close

      (JNIEnv *env, jclass jc , jint fd)

    {

     

        LOGD("Jni Close ing ");

     

    }

     

    JNIEXPORT jstring JNICALL Java_com_cem_hellojni_HelloActivity_read

      (JNIEnv *env , jclass jc)

    {

     

        LOGD("Jni Read ing ");

        //当时直接返回一个字符串失败,应该转换一下,APK上层才能够识别

        return (*env)->NewStringUTF(env,(char*)buf);

     

    }

     

    5、  编写Android.mk

    LOCAL_PATH :$(call my-dir)

     

    include $(CLEAR_VARS)

     

    TARGET_PLATFORM := android-4

    LOCAL_MODULE    := hellojni

    LOCAL_SRC_FILES := com_cem_hellojni_HelloActivity.c

    LOCAL_LDLIBS    := -llog

     

    include $(BUILD_SHARED_LIBRARY)

    6、  编写Application.mk

    APP_ABI := armeabi armeabi-v7a x86

    7、  通过ndk-bulid编译生成库文件

    # cd "C:Documents and SettingsgonglinyuanworkspaceHelloJni"

    #$ndk/ ndk-build

    Android NDK: WARNING: APP_PLATFORM android-17 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml

    [armeabi] Compile thumb  : hellojni <= com_cem_hellojni_HelloActivity.c

    [armeabi] SharedLibrary  : libhellojni.so

    [armeabi] Install        : libhellojni.so => libs/armeabi/libhellojni.so

    [armeabi-v7a] Compile thumb  : hellojni <= com_cem_hellojni_HelloActivity.c

    [armeabi-v7a] SharedLibrary  : libhellojni.so

    [armeabi-v7a] Install        : libhellojni.so => libs/armeabi-v7a/libhellojni.so

    [x86] Compile        : hellojni <= com_cem_hellojni_HelloActivity.c

    [x86] SharedLibrary  : libhellojni.so

    [x86] Install        : libhellojni.so => libs/x86/libhellojni.so

     

    8、  生成APK文件,测试

    最终实例代码下载地址:http://files.cnblogs.com/android100/HelloJni.rar

  • 相关阅读:
    数据库的查询优化技术(转载)
    数据库查询优化方案(处理上百万级记录如何提高处理查询速度)(转载)
    oracle 游标使用详解
    MySQL-linux系统下面的配置文件
    git分支相关的命令
    让双网卡同时工作在内网和外网
    比较ping,tracert和pathping等命令之间的关系
    选择图片,获取图片
    导出功能代码
    什么是以太网??
  • 原文地址:https://www.cnblogs.com/android100/p/android-Jni-NDK.html
Copyright © 2020-2023  润新知