NDK33_最全排查UnsatisfiedLinkError: No implementation found

本文详细介绍了在使用NDK进行Android应用开发时遇到的“No implementation found for java.lang.String”错误的排查与解决过程。从Gradle配置到CMakeLists.txt设置,再到确保Java和C/C++代码间的正确链接,最后通过清理项目缓存完成问题修复。

NDK开发汇总
报错:No implementation found for java.lang.String

问题排查

  1. build.gradle配置 abiFilters ‘armeabi-v7a’
android {
			...
			defaultConfig {
       		 ...
	       		 externalNativeBuild {
       	    		 cmake {
              			  cppFlags ""
              			  abiFilters 'armeabi-v7a'
         	   		}
        	}
    	}
    }
  1. CmakeList配置实现方法的cpp路径:add_library
cmake_minimum_required(VERSION 3.4.1)

# 引入指定目录下的CMakeLists.txt
add_subdirectory(src/main/cpp/librtmp)

add_library(
             native-lib

             SHARED

             src/main/cpp/native-lib.cpp
             src/main/cpp/VideoChannel.cpp)
...
  1. 检查包名路径与c/cpp中静态注册的是否一致
    java路径:com.cn.ray.rtmpdump.LivePusher
    cpp实现方法
#include <jni.h>
#include <string>
#include "safe_queue.h"

extern "C" JNIEXPORT void JNICALL
Java_com_cn_ray_rtmpdump_LivePusher_native_1init(JNIEnv *env, jobject instance) {



}

注意:

  • 引入#include <jni.h>
  • 方法中有_后面带1
  • cpp中实现带extern “C”,extern "C"只针对当前这一个方法
  1. loadLibrary 要在方法调用前(static)加载,注意是 System.loadLibrary
 static {
        System.loadLibrary("native-lib");
    }
  1. 清除缓存
    Clean Project-> Rebuild Project -> Refresh Linked C++ Projects
Process: com.bilibili.fatego, PID: 6367 java.lang.UnsatisfiedLinkError: No implementation found for void com.bun.miitmdid.utilsforrequestpermission.PermissionTransparentActivity.onCreate(android.os.Bundle) (tried Java_com_bun_miitmdid_utilsforrequestpermission_PermissionTransparentActivity_onCreate and Java_com_bun_miitmdid_utilsforrequestpermission_PermissionTransparentActivity_onCreate__Landroid_os_Bundle_2) - is the library loaded, e.g. System.loadLibrary? at com.bun.miitmdid.utilsforrequestpermission.PermissionTransparentActivity.onCreate(Native Method) at android.app.Activity.performCreate(Activity.java:9391) at android.app.Activity.performCreate(Activity.java:9363) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1541) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4598) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4821) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:242) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:138) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:85) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3110) at android.os.Handler.dispatchMessage(Handler.java:115) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.app.ActivityThread.main(ActivityThread.java:9952) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074)
09-19
自适应链表是一种数据结构,它能够自动调整其内部节点的数量以优化存储效率,特别是在插入和删除操作频繁的情况下。传统的链表需要预先分配一定数量的节点,而自适应链表则动态地管理节点,当内存空间足时添加新节点,当内存充足且连续时合并节点以减少空闲空间。 下面是一个简单的自适应链表(Adaptive Array List)的Python实现概述: ```python class Node: def __init__(self, value): self.value = value self.next = None self.prev = None class AdaptiveList: def __init__(self): self.head = None self.tail = None self.size = 0 self.capacity = 16 # 初始容量 def append(self, value): if not self.head: self.head = self.tail = Node(value) else: new_node = Node(value) self.tail.next = new_node new_node.prev = self.tail self.tail = new_node self.size += 1 if self.size > self.capacity * 2: # 当大小超过两倍容量时扩容 self.resize(2 * self.capacity) def resize(self, new_capacity): old_head = self.head self.head = self.tail = Node(None) # 创建新的头和尾 self.tail.next = old_head old_head.prev = self.tail for _ in range(self.size): current = old_head old_head = old_head.next self.append(current.value) # 将所有元素移动到新链表 # 使用示例 alist = AdaptiveList() alist.append(1) alist.append(2) ... ``` 在这个实现中,`append`方法会检查是否需要扩容。如果链表已满,就创建一个新的更大的链表,然后将原有链表的所有节点复制到新链表。这样,我们可以在保持高效的同时避免浪费内存。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值