16boke - 一路博客

JNI Android平台之一实例(包、解决中文路径乱码、数组传入、传出)

    以C++实现读写文件,Java调用为例。包括中文路径的传递和数组的传入传出。

1.环境准备

    安装JDK,作者的是64位版本1.8.0_60,并正确配置环境变量。

    安装adt,作者用的是adt-bundle-windows-x86_64-20131030,需要的可以去我的网盘下载。http://pan.baidu.com/s/1ntZ5V7b

    安装ndk,作者用的是android-ndk-r9,需要的可以去我的网盘下载。http://pan.baidu.com/s/1c1foakg

2.环境搭建

    (1) 新建Android工程

        File->New->Android Application Project

        Application Name:WriteReadJ,其它都是默认。

        

    (2)点击菜单栏Window->Preferences,弹出的Preferences对话框中,选择Android->NDK,填写NDK Location,即android-ndk-r9c的位置。

        

    (3) 项目中新建jni文件夹,该文件夹用于放置C/C++源文件等。

    (4) 配置jni的自动编译选项Builder

        步骤如下所示,英文原文:http://mobilepearls.com/labs/ndk-builder-in-eclipse/

        (a) 新建一个Builder,Project->Properties->Builders->New。

        (b) 在弹出的Choose configuration type对话框,双击Program(或选择Program,点击OK)。

        

    (c) 在弹出的Edit Configuration对话框中,Name输入新Builders的名字(任意取)。

        配置选项卡Main。

        Location中输入ndk-build.cmd的路径,可以点击Browser File System按钮来选择路径。

        Working Directory输入,点击Browser Workspace选择WriteReadJ。

        

        配置选项卡Refresh

        勾选Refresh resources upon completion.

        选择The entire workspace

        勾选Recursively include sub-folders

        

        配置选项卡Build options

        勾选After a "Clean"(勾选这个操作后,只需要Clean一下项目,就开始交叉编译)

        勾选During manual builds

        勾选During auto builds

        勾选 Specify working set of relevant resources

        

        点击Specify Resources...勾选WriteReadJ项目的jni目录,点击Finish。

        

        点击OK,环境搭建完成。

3.编写java代码(参见JNI Windows平台)

    (1) 新建一个类

        Package:com.yiluboke.zxy

        Name:WriteReadJ

        其它都是默认

        

    (2) 修改MainActivity中onCreate的代码

4.在jni文件夹下,创建文件,编写C++代码(参见JNI Windows平台)

    (1) 找到Android项目中bin目录下的classes文件夹,该目录下有eclipse自动生成的字节码文件。

        打开cmd,在\WriteReadJ\bin\classes路径下,输入命令javah com.yiluboke.zxy.WriteReadJ,回车。

        

        \WriteReadJ\bin\classes目录下,生成头文件com_yiluboke_zxy_WriteReadJ.h,将此文件拷贝入jni目录下中。

        

    (2) 编写C++代码。

5.在jni文件夹下,新建文件Android.mk和Applcation.mk,内容分别如下:

    Android.mk

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_CPP_EXTENSION := .cpp
    LOCAL_MODULE := jniwritereadfile
    LOCAL_SRC_FILES := com_yiluboke_zxy_WriteReadJ.cpp writeReadDo.cpp
    include $(BUILD_SHARED_LIBRARY)

    Applcation.mk

    APP_MODULES := jniwritereadfile
    APP_ABI := all
    APP_PLATFORM := android-19
    APP_STL := stlport_static

    LOCAL_PATH C/C++代码所在目录,即jni目录。

    my-dir是编译系统提供的宏函数,返回Android.mk所在目录的路径。

    LOCAL_CPP_EXTENSION 要编译文件的扩展名

    LOCAL_MODULE 要编译的库的名称。编译器会自动在前面加上lib,后面加上.so。

    LOCAL_SRC_FILES 要编译的C/C++文件。

    具体详情自行百度。

6.AndroidManifest.xml中添加下面的代码设置读写SD卡的权限

<!--在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--  从SDCard读取数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

7.点击Project->Clean->选中WriteReadJ,会自动编译,可以看到libs目录下libjniwritereadfile.so文件编译完成。

8.运行WriteReadJ工程

    使用真机运行。

    由于没带真机,就用模拟器看下效果吧。

    

9.完整Demo下载

    百度网盘地址:http://pan.baidu.com/s/1geyKTUj

    本文采用的JDK是 64位版本1.8.0_60。

编译错误:

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

    AndroidManifest.xml修改SDK为合适的版本。

作者的:

    

修改为

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />

NDK  C++  Java  JNI