Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> JNI Android平台之一實例(包、解決中文路徑亂碼、數組傳入、傳出)

JNI Android平台之一實例(包、解決中文路徑亂碼、數組傳入、傳出)

編輯:關於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" />

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved