1. 程式人生 > >客戶端工程的搭建

客戶端工程的搭建

安卓專案工程目錄結構

這裡寫圖片描述

1.搭建Android Studio下C++編寫環境

1.1在java目錄的活動處理包目錄下新建Jni類

在Jni類中需要寫一個Jni物件的單例為了確保只有一個Jni物件

package com.example.itcast.driver;

/**
 * Created by itcast on 16-9-27.
 */
public class Jni {
    private static Jni theOne = null;
    public static Jni getInstance()
    {
        if (theOne == null
) theOne = new Jni(); return theOne; } /** * C++function,一定要加native因為那是為了說明該函式不在java中處理 */ public native boolean Login(String username, String password); static { System.loadLibrary("myjni"); } }

1.2 建立cpp臨時專案,裡面沒有main函式,為了最終生成.so給編譯器用,由於這個.so是要整合java環境,所以只能在NDK裡面去交叉編譯

  1. 在專案目錄Driver下新建jni資料夾
  2. 在jni目錄下新建檔案jni.cpp,這個jni檔案和jni.cpp是不能自定義的
  3. 到linux中的java目錄下執行命令
itcast@itcast:~/prothree/bc/client/Driver/app/src/main/java$ javah -jni com.example.itcast.driver.Jni

或者直接在Android Studio下面的Terminal中轉到Java目錄下執行上面的命令,為的就是生成C++function函式對應的標頭檔案
注意看好目錄,必須是Java目錄,不然報錯,最後也不要寫.java,因為要的是類名。


如果沒有找到javah,你知道(壞笑),肯定path裡面沒配置啦
4. 生成的標頭檔案在java目錄下
5. 將com_example_itcast_driver_Jni.h也就是包名對應的.h檔案裡面的內容拷貝到jni.cpp裡面。
6. 去掉
#ifndef _Included_com_example_itcast_driver_Jni
#define _Included_com_example_itcast_driver_Jni
……
#endif
3行話,因為到.cpp裡面了就不是標頭檔案了。
並把函式定義展開為函式體。

#ifdef __cplusplus
extern "C" {
#endif
......
#ifdef __cplusplus
}

這個不能去掉是因為javah執行出的標頭檔案函式名解析是按照c語言的風格解析的,c++裡面由於函式過載,雖然函式名錶面是一樣,但是編譯器會根據引數型別重新給每個函式一個函式名,去掉可能會導致最後編譯不了。
7. 建立類,是可以同時建立.c和.h的,如果不需要類,去掉class就好

1.3 編譯.so檔案

1.在jni目錄下面新建Android.mk
定義編譯關係,相當於Makfile

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
# libmyjni.so
LOCAL_MODULE := myjni
LOCAL_SRC_FILES := cJSON.c  CurlWrap.cpp  jni.cpp  JniUtil.cpp  JsonWrap.cpp  User.cpp
LOCAL_LDLIBS := -llog -lz
LOCAL_STATIC_LIBRARIES := libcurl
include $(BUILD_SHARED_LIBRARY)

2.在jni目錄下新建Application.mk
定義編譯的環境,應該按什麼平臺進行編譯

APP_ABI := armeabi

3.在jni目錄下面執行ndk-build編譯

itcast@itcast:~/prothree/bc/client/Driver/jni$ ndk-build 

如果沒有ndk-build需要配置環境變數

export NDK_BUNDLE=/home/itcast/Android/Sdk/ndk-bundle
export PATH=$PATH:$NDK_BUNDLE

4.在client目錄下面編寫jni.sh指令碼,方便ndk-build

#!/bin/bash

dir=$1
rm $dir/app/src/main/jniLibs -rf 
mkdir $dir/app/src/main/jniLibs

cd $dir/jni
ndk-build

cp ../libs/* ../app/src/main/jniLibs -R

5.補充說明
更換Android Studio的啟動Activity
在AndroidManifest.xml中將

<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

剪下到你要啟動的Activity裡面,例如:

<activity android:name=".LoginActivity">

</activity>

2.安裝NDK

在安卓建立專案介面(如果已經開啟專案,可以在file->close project關閉專案)->Configure->Project Default->Project Stucture->在安卓NDK下面有個Download,點選下載,下載的時候注意源要選中國區的,主伺服器太慢了,下載好之後重啟一下Android Studio,會自動找到NDK目錄繫結到配置裡面

3.安裝QT

在安裝tufao那篇部落格有
1. 在QT中開啟jni專案
New Project->Import Project->Import Existing Project->choose或者雙擊->Project Name:Driver-jni Location:/home/itcast/prothree/bc/client/Driver/jni->Next->Next-Finish
2.在專案目錄下的Driver-jni.includes 中配置ndk-build路徑
為了消除jni的橫線,千萬不能加到.的後面,換行加

.
/home/itcast/Android/Sdk/ndk-bundle/platforms/android-12/arch-arm/usr/include

加了之後如果還有下劃線可以run一下,之後就沒了