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中找到

 

 

 

posted on 2023-01-12 15:36  耀礼士多德  阅读(6)  评论(0编辑  收藏  举报