Android Studio 编写Jni

最近客户要求写一个操作串口的JNI,并按他们的要求编写,并把源码给他们,我也是醉了,网上不是有操作串口的JNI吗?拿来用不就可以了,真是没办法,因为刚接触Android Studio不久,以前都是直接在源码里或Eclipse编写并编译JNI代码的(现在Google用他们的亲儿子AS,不用干儿子EC了,没办法,一把年纪了也要硬着头皮学了),设置如下:

1.在AS的File菜单里找到Settings,点击进入Settings界面,并选择External Tools:

Android Studio 编写Jni_第1张图片

2.击点右边界面上的+号,设置生成头文件扩展工具:

Android Studio 编写Jni_第2张图片

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

注:$JDKPath$,$Classpath$ 这些直接点击右边的按钮自行选择,下面的图也是一样。


3.点+号生成ndk编译扩展工具:

Android Studio 编写Jni_第3张图片

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

4.生成清除扩展工具:

Android Studio 编写Jni_第4张图片

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

Android Studio 编写Jni_第5张图片

        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文件:

Android Studio 编写Jni_第6张图片

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文件:

Android Studio 编写Jni_第7张图片

以上步骤,如果你在写jni时有不成功的地方,请指出,谢谢!


你可能感兴趣的:(android)