1. 程式人生 > >Android Studio 編寫Jni

Android Studio 編寫Jni

最近客戶要求寫一個操作串列埠的JNI,並按他們的要求編寫,並把原始碼給他們,我也是醉了,網上不是有操作串列埠的JNI嗎?拿來用不就可以了,真是沒辦法,因為剛接觸Android Studio不久,以前都是直接在原始碼裡或Eclipse編寫並編譯JNI程式碼的(現在Google用他們的親兒子AS,不用幹兒子EC了,沒辦法,一把年紀了也要硬著頭皮學了),設定如下:

1.在AS的File選單裡找到Settings,點選進入Settings介面,並選擇External Tools:


2.擊點右邊介面上的+號,設定生成標頭檔案擴充套件工具:


$JDKPath$/bin/javah
-classpath $Classpath$ -v -jni $FileClass$
$SourcepathEntry$\..\jni

注:$JDKPath$,$Classpath$ 這些直接點選右邊的按鈕自行選擇,下面的圖也是一樣。

3.點+號生成ndk編譯擴充套件工具:


$ModuleSdkPath$/ndk-bundle/ndk-build.cmd
$ModuleFileDir$\src\main

4.生成清除擴充套件工具:


$ModuleSdkPath$/ndk-bundle/ndk-build.cmd
clean
$ModuleFileDir$\src\main
5.在module下找到build.gradle加入如下程式碼:

        ndk {
            moduleName "my_serial_jni"
            abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結構下的so庫。
            //stl "stlport_static"    //開啟.c 的 debug (此句是開啟的debug的關鍵)
        }

        sourceSets.main {
            jni.srcDirs = []
            jniLibs.srcDir "src/main/libs"
        }


6.右鍵module,New->Folder->JNI Folder新建jni目錄備用,再編寫JniSerial.java,由於某些問題,就不貼具體程式碼了,只是說一下方法,請見諒:
public class JniSerial {

    public native int open();
    public native int close();

    static {
        try {
            System.loadLibrary("my_serial_jni");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
7.在AS的Build選單下選擇:Build Module 'app',然後右鍵JniSerial.java,按下圖會在剛才新建的jni目錄下生成.h檔案:

8.在Jni目錄下增加JniSerial.c檔案,具體程式碼可以參照網上的串列埠檔案

9.在Jni目錄下增加Android.mk和Application.mk兩個檔案:

# Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := fm_serial_jni
LOCAL_SRC_FILES =: jniSERIAL.c
LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llog
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)


# Application.mk
APP_MODULES := my_serial_jni
APP_ABI := all

10.編譯Jni目錄,系統編譯成功後會在當前目錄下生成libs和obj兩個目錄,並生成相應的so檔案:

以上步驟,如果你在寫jni時有不成功的地方,請指出,謝謝!