必要条件:

(一)安装JDK

(二)安装NDK

(三)安装Android Studio(其实可以不用装也行)

使用Android Studio构件.so包

构件.so包

1. 使用Android studio,Native C++项目

2.

这两个文件不想要,干掉!

不过,倒是可以参考一下怎么写的,例如:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Used to load the 'cpplib' library on application startup.
static {
System.loadLibrary("cpplib");
} private ActivityMainBinding binding; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot()); // Example of a call to a native method
TextView tv = binding.sampleText;
tv.setText(stringFromJNI());
} /**
* A native method that is implemented by the 'cpplib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}

主要是红色这里有点特别,MainActivity.java 删掉后,依葫芦画瓢,也这么整。

再看native-lib.cpp

#include <jni.h>
#include <string> extern "C" JNIEXPORT jstring JNICALL
Java_com_southgz_cpplib_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

jstring:应该是返回的类型

JNIEXPORT、JNICALL:应该是特定的关键字

盲猜,要返回int型,应该用jint  !

Java_com_southgz_cpplib_MainActivity_stringFromJNI:Java_包名_类名_方法名

开始制作

1. 添加一个java类,用于调用c++

public class cppDemo
{
static {
System.loadLibrary("cpplib");
}
public native int add(int a,int b);
}

2. 添加cpp文件,实现add函数

注意文件放置的位置,要新建jni

#include <jni.h>
#include <string>
JNIEXPORT jint JNICALL Java_com_southgz_cpplib_cppDemo_add
(JNIEnv *, jobject, jint i, jint j){
return i+j;
}

3.  新建Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := CppLib
LOCAL_SRC_FILES := cppdemo.cpp include $(BUILD_SHARED_LIBRARY)

4. 生成:

注意要进入到的目录

5. 生成后,出现:


还有更简单的办法,不需要使用Android studio,直接使用ndk!!

随便搞一个位置,将Android.mk,cppdemo.cpp拷贝过来

注意,文件夹依然叫【jni】!!

Android.mk内容和上面一样即可。

(这里可以感受到,其实ndk就是用来将c++编译生成各个CPU架构的.so包,所以它也会对c++代码进行语法检查啥的)

cppdemo.cpp改一下内容,使用最简单的c++代码试试

在jni文件夹内,敲CMD

自动在最外层,得到libs和obj两个文件夹

其中,libs为所求


使用.net MAUI 调用

新建一个Android绑定库的项目,将文件拷贝到项目下

保险起见,也改一下生成操作

项目设置,也要改一下

开始写代码:

直接在APP入口处测试

注意:跨平台传值,最好用最简单的int, byte这些来代替,连char都不要用了,实测传递char* 会发生和预期不一样的结果。

或者,每传递任何东西,都从字节方面思考。

在监视窗口中发现,附合预期!!

最后看看打包好的apk,里面确实也有libs

总结:

还是微软开发舒服点,看到Android studio项目一堆配置文件,各级目录头都大


没完

这一套在debug模型下没问题,但是切换到release下,打包成apk安装,就出现闪退,办法:

不要勾选!!

参考:https://www.cnblogs.com/wgscd/p/16403816.html

如何查看安装后apk中调用.so的情况?

学会使用adb工具查看日志:https://blog.csdn.net/m0_57098592/article/details/129441707

参考微软的文档:https://learn.microsoft.com/zh-cn/xamarin/android/deploy-test/debugging/android-debug-log?tabs=windows

(注意,这不是在调试模式下做的。)

只要连上USB,VS能监听日志。

使用命令行也可以查找调试信息

MAUI调用.so库的更多相关文章

  1. Java调用动态库方法说明-最详细

    Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...

  2. C#:控制台程序调用中间库创建窗体

    1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...

  3. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  4. C++调用C#库简单例程

    有些时候,为了使用别人已经写好的C#库文件,我们需要使用C++调用C#库文件: 以下做了一简单的调用工程,步骤如下: 1.准备C#库 (dll文件)   1)创建C#库:     2)编写C#类:   ...

  5. iOS开发:在Swift中调用oc库

    先列举这个工程中用到的oc源码库: MBProgressHUD:半透明提示器,Loading动画等 SDWebImage:图片下载和缓存的库 MJRefresh: 下拉刷新,上拉加载 Alamofir ...

  6. Qt中调用PolarSSL库(一)

    最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...

  7. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  8. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  9. windows下Qt Creator5.1.0编写程序以及调用OpenCV库

    系统说明 最近使用opencv编写程序,程序编的差不多就学习使用QT加个界面,首先声明下本人的系统和使用的软件版本, 系统: windows xp QT IDE:QT Creator5.1.0 Ope ...

  10. Python调用C库

    Python调用C库 Python可以利用ctypes库很方便地调用C的库函数. C库例程: # file: a.c int sum(int a, int b){   int t = 0;   int ...

随机推荐

  1. 从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建、医药知识图谱的自动问答等

    从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建.医药知识图谱的自动问答等 项目介绍 关于知识图谱概念性的介绍就不在此赘述.目前知识图谱在各 ...

  2. 解决idea登录github出现的invalid authentication data 404 not found以及登录 token 失效

    0.错误提醒: Your token is invalid, please re-login github and get token again. 报错无效的用户名(invalid username ...

  3. Python 封装zabbix-get接口

    Zabbix 是一款强大的开源网管监控工具,该工具的客户端与服务端是分开的,我们可以直接使用自带的zabbix_get命令来实现拉取客户端上的各种数据,在本地组装参数并使用Popen开子线程执行该命令 ...

  4. “I/O多路复用”和“异步I/O”的前世今生

    曾经的VIP服务在网络的初期,网民很少,服务器完全无压力,那时的技术也没有现在先进,通常用一个线程来全程跟踪处理一个请求.因为这样最简单.其实代码实现大家都知道,就是服务器上有个ServerSocke ...

  5. Load-balanced-online-OJ-system 负载均衡的OJ系统项目

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 本项目Github地址 - ...

  6. 使用DoraCloud搭建支持统信UOS桌面的信创云桌面系统

    信创云桌面 信创云桌面采用国产的芯片,支持国产的桌面操作系统.本方案采用海光CPU的服务器,运行DoraCloud云桌面系统.可以支持统信UOS桌面系统和麒麟桌面操作系统. 环境准备 服务器:海光 5 ...

  7. golang 中 取切片元素 与 切片再生成切片的区别

    func main() { //定义一个切片 a := []byte{1, 2, 3} fmt.Printf("a的类型%T\n", a) //a的类型[]uint8 fmt.Pr ...

  8. 《ASP.ENT Core 与 RESTful API 开发实战》-- (第4章)-- 读书笔记(上)

    第 4 章 资源操作 4.1 项目创建 从本章起,我们将创建一个在线图书馆项目,通过这个 Web API 应用程序来实际地熟悉并掌握如何使用 ASP.NET Core 创建 RESTful API 应 ...

  9. 《ASP.NET Core 微服务实战》-- 读书笔记(第7章)

    第 7 章 开发 ASP.NET Core Web 应用 ASP.NET Core 基础 在本章,我们将从一个命令行应用开始,并且在不借助任何模板,脚手架和向导的情况下,最终得到一个功能完整的 Web ...

  10. 快速上手typescript(基础篇)

    壹 ❀ 引 在javascript开发中,你可能也遇到过我这样的苦恼,在维护某段几年前的老旧代码时,我发现了某个数据加工方法fn,而且根据现有逻辑来看fn的某个参数是一个数组,因为新需求我需要对数组做 ...