关于:(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. js文件下载blob

    使用axios文件下载 if (tableDataSource.selectedRowKeys.length > 0) { //本次请求你携带token axios.defaults.heade ...

  2. echarts中x轴文字太长换行的几种方式

    我们在使用echarts中,可能会遇见文字太长.导致显示不完全. 我们可以使用换行来处理 第一方式直接使用 \n 文字直接换行显示 使用\n <!DOCTYPE html> <htm ...

  3. vue写组件时的命名规范

    1组件命名驼峰 如myBread.vue(组件) 2引入时,接受同样是驼峰 import MyBread from "@/components/cuscom/myBread.vue" ...

  4. elementui出现展开后子菜单宽度多出1px问题

    添加 就可以解决了 .el-menu { border-right-width: 0; } <template> <div class="compen-left-men&q ...

  5. Python 潮流周刊第 29 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  6. electron-builder

    electron-builder打包工具 首先,确保你的项目中已经安装了 electron-builder.可以在项目根目录下运行以下命令来安装它: npm install electron-buil ...

  7. 在cmd(命令行)或bat文件切换盘符

    bat文件 写一个自动更新git的bat文件,如果bat文件放在E盘,想要去到D盘的某个目录下执行命令,代码如下: SET ksf=D:\code\KSFramework @echo on d: cd ...

  8. PGL图学习之图游走类metapath2vec模型[系列五]

    PGL图学习之图游走类metapath2vec模型[系列五] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5009827?contr ...

  9. 21.1 动态TLS--《Windows核心编程》

    应用程序通过调用一组4个函数来使用动态 TLS,这些函数实际上最经常为 DLL 所使用. 通常情况下,如果DLL使用 TLS,那么当它用 DLL_PROCESS_ATTACH 标志调用它的 DllMa ...

  10. ASCII、Unicode、UTF8 10年后,重新整理《专题1》

    以后基本都是Unicode定义二进制对应的字符,UTF8来按照一种格式来存储Unicode二进制,所以只需知道 unicode unicode 官网:https://home.unicode.org/ ...