关于:(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中找到

Android\C++\C#\Java的更多相关文章

  1. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  2. android studio Error:java.lang.OutOfMemoryError: GC overhead limit exceeded

    android studio Error:java.lang.OutOfMemoryError: GC overhead limit exceeded 在app下的build.gradle中找到and ...

  3. Android开发之Java必备基础

    Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...

  4. Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

    Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...

  5. [Android Exception 1A] -com.android.volley.NoConnectionError: java.io.InterruptedIOException

    - ::-/com.tongyan.tutelage W/System.err: com.android.volley.NoConnectionError: java.io.InterruptedIO ...

  6. Android 框架简介--Java环境(转)

    ==========================上=========================== 这里简单的介绍了Android的java环境基础,在后面一节中会结合具体的实例来理解这一节 ...

  7. Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html Android JNI之JAVA与C++对象建立对称关联 1.JAVA对象持有C++对象 ...

  8. android中在java代码中设置Button按钮的背景颜色

    android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...

  9. Android系统执行Java jar程序 -- dalvik运行dex Java工程

    本文仅针对纯java工程执行进行诠释,一般在PC平台作为jar包形式存在,在Android平台则以dex包形式存在. Java属于高级程序语言,Java程序需要运行在特定的虚拟机中,虚拟机将Java字 ...

  10. Android RIL的java框架

    Android RIL的Java部分也被分为了两个模块,RIL模块与Phone模块.其中RIL模块负责进行请求以及相应的处理,它将直接与RIL的原声代码进行通信.而Phone模块则向应用程序开发者提供 ...

随机推荐

  1. vue中$once的使用

    $once 可以给组件实例绑定一个自定义事件,但该事件只能被触发一次,触发之后随即被移除 $once的简单使用 <template> <div> <button @cli ...

  2. 【四】-强化学习入门简介---PaddlePaddlle强化学习及PARL框架

    相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...

  3. C/C++ 实现获取硬盘序列号

    获取硬盘的序列号.型号和固件版本号,此类功能通常用于做硬盘绑定或硬件验证操作,通过使用Windows API的DeviceIoControl函数与物理硬盘驱动程序进行通信,发送ATA命令来获取硬盘的信 ...

  4. 2、数据库:SQL Server部署 - 系统部署系列文章

    对于微软的SQL Server的安装,以前已经有写过了,到了2022版本,安装没多大的改变,很多只需要少配置,然后直接下一步即可.现在是2023年了,SQL Server已经出到了2022版本,这篇博 ...

  5. 4.2使用IDA Pro分析实战--《恶意代码分析实战》

    使用 IDA Pro 分析 Lab05-01.dll 1.DllMain的地址是什么? 2.使用Imports窗口并浏览到的gethostbyname,导入函数定位到什么地址? 3.有多少函数调用了g ...

  6. phpwind 缓存的问题

  7. 使用了未经检查或不安全的操作。 有关详细信息, 请使用 -Xlint:unchecked 重新编译

  8. .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    2.3.4 Web API -- MVC终结点 MVC与MVVM 模型绑定 自定义模型绑定器 模型验证 返回数据处理 MVC与MVVM MVC ASP.NET Core MVC 概述:https:// ...

  9. .NET Core开发实战(第12课:配置变更监听)--学习笔记

    12 | 配置变更监听:配置热更新能力的核心 这一节讲解如何使用代码来监视配置变化并做出一些动作 当我们需要追踪配置发生的变化,可以在变化发生时执行一些特定的操作 配置主要提供了一个 GetReloa ...

  10. CF1913

    C 先用桶记录各个位数量. 对于每次询问,从低位到高位扫,先用掉一个当前位的,然后把当前位的全部转化成 \(cnt/2\) 个更高位的. D 有一个思路:其实删区间可以视作删相邻两个数.(然鹅这题不是 ...