240.Android Studio3.5 写 NDK 程序(1)

【问题记录】Android V 应用SDK升级适配 安装对应版本的 SDK:打开 Android Studio,进入 SDK Manager(Tools -> SDK Manager),然后在 SDK Platforms 中找到并安装 Android SDK 版本 35(或更高版本)的平台 SDK。问题说明 :出现这个错误是因为当前的配置中没有找到 Android SDK 中对应版本号为 35 的平台 SDK。这可能是因为你的本地 SDK 中并没有安装或下载这个版本的 SDK,或者 Gradle 配置文件中指定的 SDK 版本号有误。 阅读详情

1.先给Android Studio配置NDK,可以直接在Tools---SDK Manager中,

然后可以在File---Project Structure中配置好ndk的路径

2.再针对这个ndk路径配置好环境变量,在系统变量下面添加一个变量名“NDK_ROOT”,值为NDK的路径。

最后在path中新建%NDK_ROOT%

配置好了以后在cmd窗口输入ndk-build.cmd以后有下面的打印

3.环境配置好了以后就可以写程序了

先创建一个JniDataUtil.java类,这个类是填充java需要调用c语言的方法的类

package com.ldw.jnitest;

/**
 * author: ldw
 * created on: 2019/10/13 2:13
 * description:
 */
public class JniDataUtil {

    //创建一个 native 方法
    public native static String get();
}

4.然后创建c语言,创建so

 打开 Android Studio 的 Terminal 到 移动到 app/src/main/java 目录下执行命令:javah -jni com.ldw.jnitest.JniDataUtil,

执行以后在java路径下生成com_ldw_jnitest_JniDataUtil.h

在app/src/main目录下创建一个jni的目录,然后将com_ldw_jnitest_JniDataUtil.h移动到jni的目录下,同时在 jni 目录下创建一个 c/c++ resource 文件 test.cpp,

#include<jni.h>
//导入我们创建的头文件
#include "com_ldw_jnitest_JniDataUtil.h"

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ldw_jnitest_JniDataUtil
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ldw_jnitest_JniDataUtil_get
  (JNIEnv * env, jclass obj)
  {
    return env->NewStringUTF("This is my NDK Application");
  }

#ifdef __cplusplus
}
#endif

下面的这个方法使我们从头文件中复制过来的,头文件是自动生成的com_ldw_jnitest_JniDataUtil.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ldw_jnitest_JniDataUtil */

#ifndef _Included_com_ldw_jnitest_JniDataUtil


#define _Included_com_ldw_jnitest_JniDataUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ldw_jnitest_JniDataUtil
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ldw_jnitest_JniDataUtil_get
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

 然后我们在 jni 目录下创建两个 .mk 文件:

    一个 Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)

 一个是 Application.mk:

APP_ABI := all

Android.mk参考

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

#libtestjni.so  //生成so的名字
LOCAL_MODULE := testjni   //生成模块的规则,生成的so的名字testjni
LOCAL_SRC_FILES := test.cpp   //生成模块的规则,so依赖的cpp文件可以有多个
LOCAL_LDLIBS := -llog    //生成模块的规则,当前so依赖的so

include $(BUILD_SHARED_LIBRARY)   //生成尾缀是so的文件

然后我们需要生成 so 库:

打开 Terminal,到 app/src/main/jni 目录下,使用 ndk-build 命令生成 so 库:

                                 

接着打开 app/src/main/libs 就可以看见我们生成的 so 库了。

                                

5.为了防止 so 库兼容错误,在 gradle.properties 最后一行添加:

android.useDeprecatedNdk=true

为了让项目能够找到我们的 so 库,在app下面的 build.gradle 文件夹的 android 下添加:

sourceSets {
     main() {
         jniLibs.srcDirs = ['src/main/libs']
         jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
     }
}

6.然后我们在 JniDataUtil.java 中动态导入 so 库,不需要写 libJNITest,只用写 JNITest:

package com.ldw.jnitest;

/**
 * author: ldw
 * created on: 2019/10/13 2:13
 * description:
 */
public class JniDataUtil {

    // 动态导入 so 库
    static {
        System.loadLibrary("JNITest");
    }

    //创建一个 native 方法
    public native static String get();
}

然后我们在 MainActivity 中打印 JNITest 的 get() 方法获取到的 String 值,Toast中会弹出:This is my NDK Application

package com.ldw.jnitest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initUi();
    }

    public void initUi(){
        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, JniDataUtil.get(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

可以参考文档:https://blog.youkuaiyun.com/young_time/article/details/80346631

Android系统开发实战:Linux内核编译与NDK环境配置完整指南 Linux内核作为操作系统的核心组件,负责管理硬件资源和进程调度,其编译过程涉及源码获取、配置优化和模块构建等关键技术环节。通过自定义内核配置,开发者可以实现硬件驱动定制、性能调优和系统功能扩展,这在嵌入式开发和移动操作系统优化中具有重要价值。Android NDK(Native Development Kit)则提供了C/C++本地代码开发能力,在游戏引擎、音视频处理等高性能场景中发挥关键作用。内核编译与NDK配置的结合使用,能够实现从系统底层到应用层的完整技术栈控制,特别适合需要深度定制Android系 阅读详情

相关推荐

Qt —— 在Win11下完整搭建“Qt for Android“开发环境,搭建方式二(附:所有安装包)

Qt —— 在Win11下完整搭建“Qt for Android“开发环境,搭建方式二(附:所有安装包)

203

Android学习路线推荐

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 URI与URL区分 欢迎使用Markdown编辑器 一、URI <1>什么是URI URI,通一资源标志符(Un

weixin_40588273的博客 1649

安卓(android)经典开发教程15本全

经典安卓教材,共计15本,从入门到精通样样俱全,个别PDF略微有些老,不过,经典的东西都是经久不息,看了之后绝对收益匪浅,我就是从看这些书慢慢成长起来的。 超值经典,绝不虚夸! Android SDK 中文开发文档.pdf Android 开发环境搭建步骤详细图解.pdf Android2.3用户手册.pdf Android编程入门教程.doc Android编程入门教程.pdf Android开发手册——API函数详解.pdf Android开发从入门到精通.doc Android驱动开发入门及手机案例开发分析教程.pdf Android系统移植技术详解.doc Android新手开发教程.pdf Android应用程序开发36技.pdf Android应用开发详解.pdf Linux内核阅读心得体会.pdf linux Android基础知识总结.pdf 深入浅出Android——Android开发经典教材.pdf

Android初学者书籍推荐

从学安卓到用安卓再到教安卓,我翻阅了不下二十本书,培养了多位Android开发者,《疯狂Android讲义》的第二版、第三版、第四版,《第一行代码Android》的第二版、第三版,各种大学出的Android教材,培训机构出的Android教材等等。下面挑几本比较好的,点评一下,仅供参考,不当之处还望指正。

学无止境,止于至善 4956

android studio基本设置与NDK配置.doc

android studio 1.2设置文档,属于基本设置, 主要设置File->Setting菜单、NDK的下载与配置;

android studio 3.0.1 NDK开发完整流程

解压密码123654,android studio 3.0.1 NDK开发完整流程,从0开始教你一步步完成开发,有完整DEMO,亲自测试,直接生成SO文件到指定路径,APP可直接使用。详细步骤参见:https://blog.csdn.net/zeqiao/article/details/77893167

AndroidStudio3.5 NDK JNI开发

搭建NDK环境 AndroidStudio3.5 Jni开发前言前期准备正式开始Jni操作整个流程大概是介个样的1、新建一个Android Studio 工程demojniutil。新建一个JniUtil.java文件 、只声明,不实现2、配置工程ndk路径、gradle.properties文件3、新建一个jni文件夹,然后打开Android Studio的终端,cd到这个目录,然后javac命令生成java类的头文件4、jni文件夹下新建Android.mk和Application.mk文件,同时新建

stvel的专栏 1749

AndroidStudio配置NDK

在AndroidStudio下配置NDK,生成so文件的方法,依照示例即可

介绍几本初学Android资料和教材——选对教材是快速入门的关键

对于Android初学者,快速入门选对教材非常重要,下面介绍几本Android初学入门的经典教材   (1)Android开发编程从入门到精通——Android程序员必备 Android开发编程从入门到精通,Android程序员必备教材,共十二章 ,适合从头到尾学习   (2)Android 开发环境搭建步骤详细图解 Android 开发环境搭建步骤详细图解, 初学者必备,需要什么软件

Android小家 2664

Android studio 下 NDK Jni 开发 简单例子

Android studio 下 NDK Jni 开发 简单demo 谢谢

LightTools中VBA宏的编写入门

LightTools和VBA联动

bestgamer的博客 2348

android studio下,如何减少编译生成的jni动态库的大小。

用androidstudio编译jni生成动态库发现比原先的要大。 (1)用readelf -SW "动态库名"可以看到动态库里的信息;发现有需要.debug信息段。 (2)用命令arm-linux-androideabi-strip --strip-all "动态库名";对动态库中的.debug信息进行裁剪。 (3)在android studio中的Application,mk选项中添加 

一只狍子的博客 5089

实战指南:将MediaPipe封装为Windows DLL,实现C++/C#高效调用

在计算机视觉和多媒体处理领域,跨平台框架为开发者提供了强大的算法模型和计算能力。其核心原理在于通过预训练的机器学习模型和优化的计算图,实现对图像、视频流中特定目标(如人脸、手势、姿态)的实时检测与分析。这项技术的价值在于能够将复杂的AI能力模块化,降低应用开发门槛。在实际工程实践中,为了突破特定语言生态的限制并优化部署流程,开发者常需将核心功能封装成独立的库。例如,将Google的MediaPipe框架封装为Windows动态链接库(DLL),就是一个典型的工程实践。此举能有效解决语言壁垒和部署简化问题,使

weixin_28691741的博客 360

1.3B多模态模型如何在6GB手机内存上实时运行

多模态大模型通常面临设备算力与内存的双重瓶颈,其核心原理在于视觉编码器(如ViT)与语言模型(如Qwen)的跨模态对齐与轻量化推理。技术价值体现在将原本依赖云端或高端GPU的图文理解能力,压缩至端侧可部署规模,兼顾低延迟、低功耗与高可用性。典型应用场景包括手机拍照识物、工业热成像分析、无障碍图像描述等,尤其适配中低端安卓设备。本文聚焦MiniCPM-V 4.6这一1.3B参数量级的开源模型,深入解析其INT4量化策略、三重内存墙突破(GPU共享内存、Java堆限制、系统缓存干扰)及6G内存精准卡位设计,揭示

weixin_33722405的博客 438

ArcGIS山体坡度、坡向分析

本篇文章主要记录自己在对山体坡向及坡度分析中的一些操作。

Belence_zhao的博客 7412

含分布式电源的配电网三段式电流保护影响仿真研究

文章摘要 本文研究了分布式电源(DG)接入对配电网三段式电流保护的影响。通过在Matlab/Simulink平台搭建含同步发电机型DG的10kV配电网模型,设计了基于傅里叶算法的三段式电流保护模块(I段瞬时速断、II段限时速断、III段定时限过流)。研究分析了不同DG接入位置、容量及故障点对保护系统的影响机理。仿真结果表明,DG接入会改变故障电流特性,可能导致三种典型问题:保护范围扩大引起误动、保护灵敏度下降导致拒动,以及保护选择性丧失。该研究为含DG配电网的保护配置与整定提供了理论依据和仿真参考,对保障分

huanghm88的专栏 270

优快云学院中的Android影音(流媒体)播放器开发实战基于NDK、C++和FFmpeg 课程已经上线

优快云学院中的 FFmpeg安卓流媒体播放器开发实战视频课程已经上线课程开发工具:     AndroidStudio3  Android影音(流媒体)播放器开发实战基于NDK、C++和FFmpeg 对学员要求:     本课程是具有很强实战性的应用编程,课程中会从原理讲解到代码实现,但由于项目有一定复杂度,希望学习本课程的同学要掌握c++的基本语法,课程中也用到java的代码但比较少,如果是c...

老夏课堂-夏曹俊的技术专栏 1602

ISO2626 --- Item Definition相关项定义

本文并不是针对ISO26262的一个项目,而是针对ISO26262的规范,我们在相关项定义阶段,我们需要做什么,我们的文档需要包含哪些内容的一个描述。

wj博客 909

将AS文件挪到C盘以外

将AS文件挪到C盘以外 1. 首先安装时,安装路径修改。 2. 修改SDK路径。 AS右上角SDK Manager 选择SDK 路径,提示一下,SDK路径最好不要有空格,因为如果有用到NDK的话,ndk-bundle路径不能有空格,通常NDK会安装在SDK目录下。NDK 是Native development kit缩写,是支持原生开发的工具,也就是利用jni编程,可以使你在java中调用C/C++的方法,或在C/C++中调用Java方法。NDK安装,选择SDK Tools,找到NDK,选择一个版本安

qq_36234964的博客 647

【四足机器人项目实战】四足机器人运动学、动力学模型

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人实际模型的物理难点二、四足机器人运动学模型1.方法一:DH法建立运动学模型(1)运动学建模构型方法(2)运动学模型描述方法1、基于DH法四足机器人单腿运动学模型公式推导(0)DH法科普1)原理2)实现过程3)评价(1)四足机器人的建模规则、坐标系定义及实物参数确定1)标准Denavit-Hartenberg法建模规则2)单腿运动学模型坐标系定义示意图及简化模型3)

qq_35635374的博客 1万+

【并发编程五】c++进程通信——共享内存(shared memmory)

现代操作系统,对于内存管理,采⽤的是虚拟内存技术,也就是每个进程都有⾃⼰独⽴的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程 A中 和 进程 B中 的虚拟地址是⼀样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。这样这个进程写⼊的东⻄,另外⼀个进程⻢上就能看到了,都不需要拷⻉来拷⻉去,传来传去,⼤⼤提⾼了进程间通信的速度。⽤了共享内存通信⽅式,带来新的问题,那就是如果多个进程同时修改同⼀个共享内存,很有可能就冲突了。那共享内存的⽅式,就很好的解决了这⼀问题。

junxuezheng的博客 1万+

Gemma 3 270M轻量大模型Android端实战部署指南

轻量大模型(LLM)是指参数量在100M–1B之间、专为边缘设备优化的生成式AI模型,其核心原理在于结构精简、嵌入层强化与量化感知训练(QAT)协同设计。技术价值体现在低功耗推理、离线运行能力与高指令遵循精度,显著区别于通用大模型的泛化倾向。典型应用场景包括移动端合同解析、医疗术语识别、工业文档理解等对隐私性、实时性和领域准确性要求严苛的落地环节。本文聚焦Gemma 3 270M这一具备256K词表与Q8量化支持的端侧模型,详解其在Android平台基于LiteRT与Gallery App的工程化集成路径,

weixin_34319374的博客 446

路径跟踪 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

纯追踪算法(Pure Pursuit)参考了人类驾驶行为,其基本思想是在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点直至抵达目标位置.本文详细推导纯追踪算法的理论原理及其变种——自适应纯追踪算法(APP)和规范化纯追踪算法(RPP),并提供ROS C++/Python/Matlab三种仿真实现加深理解

FRIGIDWINTER的博客 8412

Android NDK开发详解设备兼容性之支持不同的像素密度

原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库,您可使用这些平台库管理原生 activity 和访问实体设备组件,例如传感器和触控输入。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 开发应用。

hnjzfwy的博客 1044

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

3D Gaussian Splatting 从照片到任意视角漫游:30 分钟搭一个新视图合成管线

拍了一堆照片,想让玩家在场景里随意走位、看背面,但逐帧重拍不现实,传统 NeRF 又要训练很久、渲染到不了实时帧率——这正是 gaussian-splatting(3D Gaussian Splatting 官方参考实现)要解决的问题:用一组可优化的 3D 高斯表示场景,配合 CUDA 可微光栅化器,约 7 分钟训出一个能跑 135 fps 的实时新视图合成模型。 **读完后你能拿到:** -

gitblog_00626的博客 427

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android 随笔集 By tuliyuan

1.反射机制调用系统服务EthernetManager private void getNetInfo(Context context) { try { // Log.d(TAG, "dddd getNetInfo is " ); Method getServiceMethod = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", new Cla

qq_18906227的博客 2283
上一篇: 部署ndk环境(废弃)
下一篇: 241.ndk报错/system/lib, /vendor/lib]]] couldn't find "libtestjni.so"
augfun
博客等级 码龄10年 311粉丝 662原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值