客戶端工程的搭建
安卓專案工程目錄結構
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裡面去交叉編譯
- 在專案目錄Driver下新建jni資料夾
- 在jni目錄下新建檔案jni.cpp,這個jni檔案和jni.cpp是不能自定義的
- 到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一下,之後就沒了