Android\C++\C#\Java
关于:(38条消息) 千万不能错过的Android NDK下载安装及配置_石子君的博客-CSDN博客_android ndk下载
(38条消息) Android扩展知识 - so文件生成及其使用_L-FHy的博客-CSDN博客_android 生成so文件
步骤:
(一)安装JDK
(二)安装NDK
(三)安装Android Studio
经验:
(一) 安装JDK,【Java SE Development Kit (JDK)下载】2022年最新官方正式版Java SE Development Kit (JDK)免费下载 - 腾讯软件中心官网 (qq.com)
安装后,目录如下:
进入\bin:
因此,环境变量要配置为java.exe目录下的:
重要一步:必须要重启电脑才起作用,成功如下:
(二)安装ndk
安装后,目录如下
同时环境变量设置
成功标志:
(三)使用Android Studio新建一个空项目
1. 新建SerialPort.java文件,代码如图:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // public class SerialPort { public SerialPort() { } public native int open(String var1, int var2, int var3, int var4, int var5, int var6, int var7); public native int close(); public native int write(byte[] var1); public native int writeLength(byte[] var1, int var2); public native int read(byte[] var1, int var2); static { System.loadLibrary("StandardSerialPort"); } }
2. Make Project,目的是编译SerialPort.java,生成SerialPort.class文件。
位于:工程目录下\app\build\imtermediates\javac\debug\classes
3. 使用javah命令,生成c++头文件.h
使用命令行:
进入文件目录:
cd C:\D\pyl\FmosMobile\RuideApi\SerialPortApi\app\build\intermediates\javac\debug\classes
生成SerialPort.h
PS C:\D\pyl\FmosMobile\RuideApi\SerialPortApi\app\build\intermediates\javac\debug\classes> javah -jni SerialPort
注意,不要写成 javah -jni SerialPort.class这样,不需要.class
其实,不需要上面步骤也行,如果有如下文件:
.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class android_communication_serialport_SerialPort */ #ifndef _Included_android_communication_serialport_SerialPort #define _Included_android_communication_serialport_SerialPort #ifdef __cplusplus extern "C" { #endif /* * Class: android.communication.serialport.SerialPort.class * Method: open * Signature: (Ljava/lang/String;II)Ljava/io/FileDescriptor; */ JNIEXPORT jint JNICALL Java_android_1communication_1serialport_SerialPort_open (JNIEnv *, jclass, jstring, jint, jint, jint, jint, jint, jint); /* * Class: android.communication.serialport.SerialPort.class * Method: close * Signature: ()V */ JNIEXPORT jint JNICALL Java_android_1communication_1serialport_SerialPort_close (JNIEnv *, jclass); JNIEXPORT jint JNICALL Java_android_1communication_1serialport_SerialPort_write (JNIEnv *, jclass, jbyteArray); jint Java_android_1communication_1serialport_SerialPort_writeLength (JNIEnv *, jclass, jbyteArray, jint); JNIEXPORT jint JNICALL Java_android_1communication_1serialport_SerialPort_read (JNIEnv *, jclass, jbyteArray, jint); #ifdef __cplusplus } #endif #endif
其中,Android.mk:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #gcc -o libctest.so -shared -I/path/to/jdk/headers ctest.c -lc TARGET_PLATFORM := android-3 #LOCAL_MODULE := serial_port #LOCAL_SRC_FILES := SerialPort.c LOCAL_MODULE := StandardSerialPort LOCAL_SRC_FILES := StandardSerialPort.c LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_BUILD_SCRIPT := Android.mk APP_ABI := all APP_PLATFORM := android-19
然后,进入目录执行命令:
PS C:\D\pyl\FmosMobile\RuideApi\SerialPortApi\app\build\intermediates\javac\debug\classes> ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk
最后,生成的.so文件位于:
使用VSCode,包装SerialPort.java,变为.jar文件,给Xamarin使用
生成.jar
注意,VsCode也要设置成相同的包名,一定要和.cpp\.h 文件一一对应
直接copy过去,生成.jar即可
放到xamarin中,参考:Xamarin.Android 踩坑记 - 耀礼士多德 - 博客园 (cnblogs.com)
设置lib(要点)
1. 在安卓项目中,新建lib文件夹,并且,将.so文件都复制过去
2. 每个文件生成操作,设置为AndroidNativeLibrary
3. 压缩预览,能够在生成的apk中找到