MAUI调用.so库
必要条件:
(一)安装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

(注意,这不是在调试模式下做的。)
只要连上USB,VS能监听日志。
使用命令行也可以查找调试信息

MAUI调用.so库的更多相关文章
- Java调用动态库方法说明-最详细
Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...
- C#:控制台程序调用中间库创建窗体
1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...
- Android JNI如何调用第三方库
http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...
- C++调用C#库简单例程
有些时候,为了使用别人已经写好的C#库文件,我们需要使用C++调用C#库文件: 以下做了一简单的调用工程,步骤如下: 1.准备C#库 (dll文件) 1)创建C#库: 2)编写C#类: ...
- iOS开发:在Swift中调用oc库
先列举这个工程中用到的oc源码库: MBProgressHUD:半透明提示器,Loading动画等 SDWebImage:图片下载和缓存的库 MJRefresh: 下拉刷新,上拉加载 Alamofir ...
- Qt中调用PolarSSL库(一)
最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...
- [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...
- [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...
- windows下Qt Creator5.1.0编写程序以及调用OpenCV库
系统说明 最近使用opencv编写程序,程序编的差不多就学习使用QT加个界面,首先声明下本人的系统和使用的软件版本, 系统: windows xp QT IDE:QT Creator5.1.0 Ope ...
- Python调用C库
Python调用C库 Python可以利用ctypes库很方便地调用C的库函数. C库例程: # file: a.c int sum(int a, int b){ int t = 0; int ...
随机推荐
- vue写组件时的命名规范
1组件命名驼峰 如myBread.vue(组件) 2引入时,接受同样是驼峰 import MyBread from "@/components/cuscom/myBread.vue" ...
- 【JS 逆向百例】层层嵌套!某加速商城 RSA 加密
声明 本文章中所有内容仅供学习交流,敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某加速商城登录接口 ...
- HTMl插入视频背景
插入视频背景一段简单的css即可 首先定义HTML的video标签 <video src="视频路径" class="bjimg" autoplay lo ...
- 微信小程序-页面跳转wxAPI
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html wx.navigateTo(O ...
- 错误的daemon.json配置,导致docker容器启动失败 Failed to start Docker Application Container Engine
docker学习-配置错误的源 问题点剖析 参考 docker学习-配置错误的源 问题点剖析 使用docker安装了nginx,编写Dockerfile,映射端口,终于跑起来了.但是,当我重启服务器, ...
- 3.2 IDAPro脚本IDC常用函数
IDA Pro内置的IDC脚本语言是一种灵活的.C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析.IDC脚本语言支持变量.表达式.循环.分支.函数等C语言中的常见语法结构,并且还提 ...
- Win32汇编:汇编版PE结构解析器
PE格式是Windows系统下最常用的可执行文件格式,有些应用必须建立在了解PE文件格式的基础之上,如可执行文件的加密与解密,文件型病毒的查杀等,熟练掌握PE文件结构,有助于软件的分析. 在PE文件中 ...
- navicat破解(15以前的版本)
navicat破解各种不成功,很耽误事.所以,再次整理一个相对省事有效的办法.内容如下: 一:下载此激活工具 二:按下图生成激活码 1. 2. 点击手动激活 3. 将请求码按图粘贴,按图点击操作便可激 ...
- UVA12467 Secret Word 题解
题目传送门 前置知识 前缀函数与 KMP 算法 解法 考虑将 \(S\) 翻转后得到 \(S'\),然后就转化为求 \(S'\) 的一个最长子串使得其是 \(S\) 的前缀.使用 KMP 求解即可. ...
- P1405 苦恼的小明 题解
题目传送门 前置知识 扩展欧拉定理 解法 本题幂塔是有限层的,这里与 luogu P4139 上帝与集合的正确用法 中的无限层幂塔不同,故需要在到达递归边界 \(n+1\) 时进行特殊处理,对于处理 ...