必要条件:

(一)安装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. Golang并发控制方式有几种?

    Go语言中的goroutine是一种轻量级的线程,其优点在于占用资源少.切换成本低,能够高效地实现并发操作.但如何对这些并发的goroutine进行控制呢? 一提到并发控制,大家最先想到到的是锁.Go ...

  2. Markdown常用书写语法合集

    1. 文字设置 1.1 文字颜色 中常用的文字颜色有: 红色文字:<font color="red">红色文字</font> 浅红色文字:<font ...

  3. Visual Studio安装教程、Visual Studio2017软件提供,版本序列号丨编写第一个程序。

    一.安装步骤 1.安装前注意一下自己电脑的IE浏览器是不是10 版本及以上的,如果不是要先升级到10才能安装 Visual Studio2017.打开IE浏览器,点击[设置]接着点击[关于]即可查看. ...

  4. Protobuf之proto基础语法

    目录 1.说明 2.字段类型 3.字段规则 4.字段编号 5.注释 6.类型 6.1.message 6.2.service 7.枚举enum 8.保留字段 9.import 9.1.protoc指令 ...

  5. WebAssembly核心编程[2]:类型系统

    对于绝大多数编程语言来说,类型都是编程的基础,WebAssembly自然也不例外.总的来说,WebAssembly涉及的类型不多,很好掌握,接下来我们就来介绍一下WebAssembly编程涉及到的几种 ...

  6. P9816 少项式复合幂 题解

    题目链接:少项式复合幂 注意到题目的模并不是很大,我们考虑两个核心的性质. \(f(f(x)) \bmod p=f(f(x) \bmod p) \bmod p\),证明直接代入 \(f(x)\) 进去 ...

  7. MySQL 中 针对表和列的注释,方便使用其生成的实体类。mybatis-generator

  8. ArrayList中的遍历删除

    ArrayList 中的遍历删除 在代码编写过程中经常会遇到这样的要求:遍历一个线性表,要求只遍历一遍(时间复杂度\(O(n)\)),删除符合指定条件的元素,且要求空间复杂度 \(O(1)\). 例如 ...

  9. JS 可选链操作符?. 空值合并运算符?? 详解,更精简的安全取值与默认值设置小技巧

    壹 ❀ 引 说来也比较惭愧,可选链操作符?.在公司项目中使用特别频繁,而我在之前一直以为是类似奇技淫巧的写法,所以也没去查阅相关文档,直到在学习typescript时碰巧看到了可选链操作符与空值合并操 ...

  10. NC26253 小石的妹子

    题目链接 题目 题目描述 小石有 n 个妹子,每个妹子都有一个细心程度 \(a_i\)和一个热心程度 \(b_i\) , 小石想给她们一个重要程度 \(t_i\)​(重要程度为 1 表示最重要,重要程 ...