编译和引用so库

news/2024/11/23 0:17:46/

编译和引用so库

1.两种编译方式

  • ndk-build + Android.mk + Application.mk
  • CMake + CMakeList

2.Android.mk + Application.mk

(1)javac java文件的绝对路径 → 生成so库

(2)javah com.xxx.xxx.tesAdd → 生成头文件

(3) 修改头文件的后缀,并添加实现

(4)Application.mk

APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
APP_MODULES := testAdd
APP_CFLAGS += -DSTDC_HEADERS
APP_PLATFORM := android-21

(5)Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)LOCAL_C_INCLUDES := $(LOCAL_PATH)		#头文件的路径LOCAL_MODULE := testAddLOCAL_SRC_FILES := Num.cpp\com_android_makeso_2_testAdd.cppLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib-llog
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true			#不加头文件会有.o文件中的汇编问题
include $(BUILD_SHARED_LIBRARY)

(6) 编库

在当前目录运行 ndk-build

目前编这个库会有使用的问题

	AndroidRuntime: FATAL EXCEPTION: mainProcess: com.android.makeso_2, PID: 17911java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZNSt6__ndk14coutE" referenced by "/data/app/~~zMsVpovir-8ZGyyQC6QYQQ==/com.android.makeso_2-tC41E73EDKkgmsQ4flEfpw==/base.apk!/lib/arm64-v8a/libtestAdd.so"

根据查询,应该是mk文件的编译问题

和c++_static库有些关系

3.CMake + CMakeList

(1) java文件载入

public class testAdd {static {System.loadLibrary("testAdd");}testAdd() {init();}public native int add(int a,int b);public native int min(int a,int b);public native int init();public native int destory();
}

(2) 生成jni方法

JNIEXPORT jint JNICALL Java_com_android_makeso_12_testAdd_min(JNIEnv *, jobject, jint, jint);

注意return!!

(3) CMakeList.txt

add_library( # Sets the name of the library.application_makeso# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cppNum.cpp)

在build/intermediate/cmake 库找到编译出来的so库

4.so文件的使用

  • 编写java文件
    • 加载库
    • 写native方法(so库中的实现方法需要注意函数名)
  • 把so库放到jniLib(默认加载)
No implementation found for int com.android.useso.testAdd.init() (tried Java_com_android_useso_testAdd_init and Java_com_android_useso_testAdd_init__)

http://www.ppmy.cn/news/47469.html

相关文章

git教程

Git是目前最流行的分布式版本控制系统之一,它可以帮助开发者更好地管理代码和协作开发。以下是Git教程的一些内容: Git入门:介绍Git的基本概念、Git工作流程和Git常用命令。 Git分支:讲解Git分支的用法,包括新建分支、…

Flutter与Android开发:构建跨平台移动应用的新选择

Flutter与Android开发:构建跨平台移动应用的新选择 本文内容提纲如下: 介绍Flutter技术:Flutter是一种由Google推出的开源UI工具包,用于构建高性能、跨平台的移动应用。文章将介绍Flutter的基本概念、特点和优势,包括其…

Python面向对象详解(非常详细)

非常详细的讲解(爆肝1w字)👏🏻👏🏻👏🏻 零基础一样学得会👌🏻 干货满满不看后悔👍👍👍 📝个人主页→数据…

可能你已经刷了很多01背包的题,但是真的对01背包领悟透彻了吗?,看我这一篇,使君对01背包的理解更进一步【代码+图解+文字描述】

一.概念理解:什么是01背包 关于01背包的概念理解如下:01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。001背包的约束条件是给定几种物品,每种物…

数组篇刷题总结

二分查找: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target …

win11下载配置Python环境+pycharm下载

前两天快乐的把我重装的win10升级成win11,升级的时候超怕不能成功,但效果还不错,然后突然想学一学Python,所以首先来配置环境吧 一、下载安装包 建议去官网,因为自从有了Python3之后,Python2就慢慢的被淘汰…

Difference between HTTP3 and HTTP2

HTTP3目前还在不断更新中。一般每个新版本的优化,都会主要针对上一个版本的缺点。 对HTTP2,有二进制编码、头部压缩、多路复用、服务器推送等新特性去弥补了HTTP1.1中的不足。不过HTTP2基于TCP实现的,带3个缺陷:① TCP层面的队头阻…

常见的注册中心Nacos、Eureka

常见的注册中心 1.Eureka(原生,2.0遇到瓶颈,停止维护) 2.Zookeeper(支持,专业的独立产品。例如:dubbo) 3.Consul(原生,GO语言开发) 4.Nacos …