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能监听日志。
使用命令行也可以查找调试信息