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

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

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

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

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

 

posted on 2023-08-31 10:47  耀礼士多德  阅读(457)  评论(0编辑  收藏  举报