最近客户要求写一个操作串口的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$ 这些直接点击右边的按钮自行选择,下面的图也是一样。
$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时有不成功的地方,请指出,谢谢!