必要条件:

(一)安装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. C# MVC+NHibernate 分页

    一.页面代码,分为三部分,一是查询条件部分,二是数据部分,二是页码条 <div id="ticketoutquery"> <table> <tr> ...

  2. 初试高云FPGA

    前言 之前一直眼馋Sipeed的Tang系列,正好遇到有工程需要高速控制并行总线,就买了NANO 9K和Primer 20K试试水 买回来先拆的贵的20k,结果发现Sipeed设计师有奇怪的脑回路: ...

  3. 从零开始配置 vim(12)——主题配置

    在我们进一步增强vim的功能之前,我们先为vim准备一个漂亮的主题,毕竟对着一个丑陋原始的界面多少有点提不起劲来进行编程.长时间对着丑陋的界面多多少少会产生抑郁情绪的.下面推荐几款我觉得还不错的主题插 ...

  4. go中的sync.pool源码剖析

    sync.pool sync.pool作用 使用 适用场景 案例 源码解读 GET pin pinSlow getSlow Put poolChain popHead pushHead pack/un ...

  5. 21.6 Python 构建ARP中间人数据包

    ARP中间人攻击(ARP spoofing)是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式,攻击者会向目标主机发送虚假ARP响应包,使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改 ...

  6. Azure Data Factory(十二)传参调用 Azure Function

    一,引言 在实际的项目中,Azure Data Factroy 中的 Data Flow 并不能彻底帮我们完成一系列复制逻辑计算, 比如我们需要针对数据集的每一行数据进行判断计算,Data Flow ...

  7. Trino-登录WebUI页面报错,日志中提示:404 Not Foud. (Zookeeper占用8080端口,与Trino的端口冲突)

    问题描述 启动Trino客户端执行show catalogs时报错:Error starting query at http://localhost:8080/v1/statement returne ...

  8. 2023 CSP-J/S游记

    8.14 打了场 luogu 的 \(SCP\) ,给打没信心了. 8.16 普及模拟1 8.19 普及模拟2 8.22 普及模拟3 9.5 二调讲评结束后,和班主任说了考 \(CSP\) 的事情,就 ...

  9. Kettle如何连接SQL Server和问题处理

    简介 Kettle(也称为 Pentaho Data Integration)是一款开源的 ETL(Extract, Transform, Load)工具,由 Pentaho 开发.ETL 是指从一个 ...

  10. NC50614 取石子游戏 1

    题目链接 题目 题目描述 有一种有趣的游戏,玩法如下: 玩家:2人: 道具:N颗石子: 规则: 游戏双方轮流取石子:每人每次取走若干颗石子(最少取1颗,最多取K颗):石子取光,则游戏结束:最后取石子的 ...