Android NDK开发起步Hello Jni

Android Studio 配置NDK,运行第一个hello-jni安卓程序详细步骤 0 前言    本文是我一边操作一边截图记录下来的。理论上来说,如果你环境没有大问题的话,是可以成功运行出结果的。 1 准备工作 已经安装好android studio,  我安装的版本是Android Studio 2.0 Preview已经下载并解压好android ndk, 我下载的版本是 android-ndk64-r10b-windows-x86_64     2 打开a 阅读详情

http://my.oschina.net/lifj/blog/177087


Android NDK开发起步Hello Jni

上一篇讲了怎么配置NDK的开发环境。这次记录一下写一个Hello Jni的最简单的Android程序。

一。新建Android程序工程。

这里,我们需要做一下几步:
1.Layout中添加TextView的id。
2.MainActivity中声明native方法。
3.MainActivity中调用native方法。

我们这里先不loadLibrary。先load总感觉我的库还没有呢,先load做什么?有点莫名其妙。当然,你也可以先loadLibrary。看个人习惯了。

下面详细说明:
1.新建Android,名字,包名什么的随便取。一路下一步,生成之后,在默认生成的Activity的layout的TextView上加一个id。(这个都会吧)android:id="@+id/hello_jni"。此时的layout文件内容如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/hello_jni"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>


2.在MainActivity.java中声明native方法。 

public native String getHelloJniString(); 
3.在OnCreate()方法中获取TextView,并设置text。 
((TextView)findViewById(R.id.hello_jni)).setText(getHelloJniString()); 
经过2、3两步之后的MainActivity.java文件内容如下: 

package com.example.hellojni;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity
{

	public native String getHelloJniString();
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		((TextView)findViewById(R.id.hello_jni)).setText(getHelloJniString());

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


二。生成.h头文件,编写.c文件。

这一步,你需要C/C++的语言基础。(这个简单的例子只需要简单的。)
按照大多数博客,会告诉你:编译工程之后,进入工程目录文件夹下,在控制台运行
javah -classpath bin/classes -d jni com.example.hellojni.MainAcitivity 
,然后就会在工程目录下生成一个jni文件夹,里面就会有.h的头文件了。

实际上,你会遇到一个错误:


错误: 无法访问android.app.Activity
  找不到android.app.Activity的类文件

是的,大多数人都会遇到这个问题,我对此表示疑问:那些写博客的人都自己试过没有?

怎么办呢?
1. 有人提出方法,在工程目录下运行命令:
javah -classpath src -d jni com.example.hellojni.MainAcitivity 
就OK了。是的,这个是OK的。(这个命令和上面一个命令的区别就是 -classpath 不同了。)

2.还有一种方法:在工程目录下,上述命令中加上android.jar的classpath。也是可行的。也就是运行如下命令:javah -classpath F:\JNI\env\platforms\android-17\android.jar;bin/classes -d jni com.example.hellojni.MainActivity
这个命令,就是把android.jar的路径加了进去。这样,就能找到Activity类了。




以上两种可行的得到.h头文件的方法,生成的.h文件的内容是不一样的,你可以试试看。至于哪一种比较好,我目前还不清楚。因为看谷歌NDK的samples里面(samples这个文件夹,就是NDK的示例程序目录,对我们来说,就是教程了)的头文件,似乎是第一种方式。第二种方式倒是没有见到过。
我个人还是倾向于用第二种方式,虽然命令比较烦。。

头文件生成好了,刷新一下工程,就会看到如下的目录结构:

多了一个jni文件夹和里面的一长串名字的头文件。名字太长,我们改短一点,改成HelloJni.h吧。省的麻烦。

接下来编写.c的实现文件。在jni文件夹右击,选择file,命名文件名字为HelloJni.c。确定。也就是如下:

然后打开新建的HelloJni.c文件,输入如下语句并保存:

#include <stdio.h>
#include "HelloJni.h"

jstring Java_com_example_hellojni_MainActivity_getHelloJniString
  (JNIEnv * env, jobject clazz)
{
	return (*env)->NewStringUTF(env, "Hello Jni!");
}


三。编写mk文件,使用Cygwin编译出so文件。

下面开始编写mk文件。在jni目录下创建一个Android.mk的文件(A要大写哦!!不然编译会出错:

Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk /home/aditya/android-ndk-r9/build/core/add-application.mk:176: *** Android NDK: Aborting... .


)。加入如下代码并保存(里面的一些命令先不了解也是可以的。):

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := HelloJni
LOCAL_SRC_FILES := HelloJni.c
include $(BUILD_SHARED_LIBRARY)

这里,主要注意两个地方:
LOCAL_MODULE    := HelloJni 。这里的HelloJni就是你的库的名字,也就是你loadLibrary的字符串。生成出来的库是libHelloJni.so。
LOCAL_SRC_FILES := HelloJni.c 。这里的HelloJni.c就是c文件的名字。

下面打开Cygwin,进入到工程目录下,输入如下命令,并回车:

$NDK/ndk-build
出现如下画面,就说明ok了。

然后我们刷新工程,会发现,多了一个obj文件夹,和libs文件夹里面多了armeabi文件夹和里面的libHelloJni.so库。obj文件夹是没有用的,可以删掉了。

四。加载so文件,运行程序。

最后一步,我们再次进入MainActivity,加载库文件。加入后的代码如下:

package com.example.hellojni;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity
{

	static {
		System.loadLibrary("HelloJni");
	}
	
	public native String getHelloJniString();
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		((TextView)findViewById(R.id.hello_jni)).setText(getHelloJniString());

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

 

System.loadLibrary("HelloJni"); 这个字符串就是我们在mk文件中写的LOCAL_MODULE的值。

好了,至此,我们编码ok了。运行起来吧。


Android NDK 开发 定义:NDK 是 Android SDK 的补充工具集,用于将 C/C++ 代码编译成.so(Shared Object,共享库)文件,供 Android 应用(Java/Kotlin)调用。核心作用复用现有 C/C++ 代码(如算法库、游戏引擎、硬件驱动)。提升性能敏感场景(如实时渲染、音视频处理、加密计算)的执行效率。访问 Android 平台的底层 API(如 OpenSL ES 音频、OpenGL ES 图形、传感器)。适用场景高性能计算(如数学建模、图像处理)。 阅读详情

相关推荐

深入掌握Android NDK与JNI开发:Hello JNI案例解析

Android NDK(Native Development Kit)是Android平台的一个开发工具包,它允许开发者使用C和C++代码扩展Android应用程序的功能。NDK的引入主要针对需要高性能计算、访问硬件平台特有功能以及重用已有C/C++代码库的场景。NDK提供了一套工具集,包括编译器、构建系统和一些运行时库,这些运行时库使得C/C++代码能够与Java虚拟机(JVM)通过JNI(Java Native Interface)进行通信。

weixin_30218749的博客 712

Android安全:onCreate()函数的Native化

Java 在Android开发一个Activity,常规Java写法如下: package com.zyc.oncreate2native; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override pr

高新园养鸡场 1841

JNI与Android NDK开发实践:深入“Hello-jni-ndk“

Java Native Interface(JNI)是Java编程语言的标准编程接口,它允许Java代码和其他语言编写的代码进行交互,尤其用于调用C、C++等语言编写的本地方法。JNI是连接Java应用和本地系统服务(如操作系统API)的桥梁,它提供了一套丰富的API,让Java程序能够扩展和提高性能。在Java类中,你可以通过使用native关键字来声明那些需要在本地代码中实现的方法。这些方法被称为“native方法”。

weixin_42510201的博客 451

一到四代壳解决方案

第一代加固 DEX加密 proguard等混淆、其他弱加密 DEX字符串加密 静态DEX文件整体加密解密 资源加密(xml与arsc文件加密及十六进制加密) 对抗反编译(添加垃圾类) 反调试 自定义DexClassLoader 第二代加固 DEX抽取与SO加固 DEX动态加载(分为利用jni和自定义jni即自定义底层函数) DEX代码抽取到外部(类抽取加密按需解密和动态方法修改替换) SO加密 第三代加固DEX动态解密与SO混淆 Dex代码动态解密 SO代码膨胀混淆 .

Codeooo 博客 1万+

Android NDK 入门实战:Hello World 示例详解

Android NDK(Native Development Kit)是一套允许开发者使用 C/C++ 编写 Android 应用部分功能的工具集。它并非替代 Java/Kotlin 的开发方式,而是在特定性能敏感或已有 C/C++ 代码复用的场景下提供原生开发能力。NDK 主要用于图形渲染、音视频处理、加密算法等高性能需求的模块。NDK 通过 JNI(Java Native Interface)与 Java 层进行通信,使得开发者可以在 Android 应用中调用 C/C++ 编写的函数。

weixin_28888459的博客 870

Android Studio中JNI Hello World项目的实现

JNI(Java Native Interface)是Java平台标准版的一部分,允许Java代码和其他语言编写的代码进行交互。它充当Java代码与本地应用程序接口(如C、C++)之间的桥梁,使得开发者能够在Java环境中利用已有的本地库,或者实现性能敏感的操作。在本章中,我们将详细探讨编译和运行包含JNI的应用程序的整个构建流程。从命令行编译到Android Studio构建,再到在模拟器或实体设备上执行应用程序,本章将一步步带领你完成整个过程。

weixin_42405592的博客 781

Android插件化动态加载apk

插件化动态加载apk

qq_27938211的博客 3428

手把手教你用SIMCOM A7670C_FASL模组实现双路MQTT连接阿里云(附完整源码)

本文详细介绍了如何使用SIMCOM A7670C_FASL 4G模组实现双路MQTT连接阿里云,包括硬件配置、开发环境搭建、双路MQTT架构设计及实现细节。通过完整的源码示例和实战指南,帮助开发者快速掌握物联网设备开发中的多路MQTT连接技术,提升工业级应用的开发效率。

weixin_33696822的博客 227

JNI入门——hello jni

JNI(Java Native Interface,Java本地接口),实现了Java和其他语言的交互(主要是C/C++)。

Kw学编程 3456

防火墙旁挂组网

分析拓扑结构,涉及路由器、交换机、防火墙。步骤包括基础 IP 配置、OSPF、防火墙双机热备、安全策略等。第一步,路由器配置。R5、R6 连接 ISP 和核心交换机,配置接口 IP,然后 OSPF。然后防火墙,双机热备的 HRP、VRRP,还有安全策略。接着交换机,划分 VLAN,配置 TRUNK,加入 OSPF。

weixin_73298423的博客 902

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 261

Android NDK开发起步Hello Jni 及NDK开发环境搭建

这两天又要在andorid下去写客户端的解码程序了,因此必须用到FFmpeg的移植,必须要明白NDK和jni。初学。把开发环境的配置过程记下来,以后留用。 0. NDK介绍 先说下NDK的作用:       NDK(Native Development Kit),即本地开发工具,简单地说,就是在开发android应用程序的时候,在java类中调用native函数,而native函数的

shufanhao.top Blog 819

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 387

android NDK学习篇1之hello-jni

最近因项目需要,要将window下的C库移植到android中来,于是决定将NDK好好研究下。之前接触过,但感觉都是皮毛,没有对其提供的demo好好研究过,于是对NDK提供的demo进行系统学习下。 NDK版本:android-ndk-r8e 系统:linux 最简单的demo,hello-jni将整个流程以最简化展现出来。 two-libs这个demo中使用了静态库来编译生成动态库,

Sunnyfans的专栏 2278

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

一阶电路基础知识

一阶电路(First-order circuit)是指由一个电感(L)或一个电容(C)和一个电阻(R)组成的电路。根据电感或电容的位置,一阶电路可以分为RC电路、RL电路、LC电路、RLC电路。一阶电路常用于滤波、放大、时序控制等各种电子设备和系统中。通过调整电阻、电容或电感的数值,可以改变电路的频率响应、滞后/提前相位等特性,实现不同的功能和性能一阶、二阶电路区别一阶电路由一个电容或一个电感与一个电阻组成,而二阶电路则由两个电容或两个电感与一个电阻组成。

weixin_45365488的博客 1万+

Android NDK Samples入门指南:JNI基础与Hello-JNI详解

Android NDK Samples入门指南:JNI基础与Hello-JNI详解 【免费下载链接】ndk-samples 项目地址: https://gitcode.com/gh_mirrors/ndks/ndk-sample...

gitblog_00501的博客 584

GEE APP:时间序列影像批处理工具:按月筛选与智能导出解决方案出工具

本文介绍了一个基于Google Earth Engine(GEE)开发的智能时序影像处理工具,可高效处理遥感影像时间序列数据。该工具采用三栏式交互布局,包含控制面板、地图显示和缩略图预览区域。核心功能包括:1)灵活的时间筛选机制,支持年度范围选择和月份批量选择;2)智能影像筛选算法,基于云量、空间覆盖等条件自动选择最佳影像;3)交互式缩略图预览,支持点击加载完整影像;4)自动化批量导出系统,实现标准化命名和统一存储。工具可广泛应用于农业监测、城市扩张研究、生态环境评估等领域,显著提高遥感数据预处理效率,确保

此星光明博客 112

Android NDK开发中的 Hello World实例

前言(废话,可以略过):这两天接触了Android NDK(Native Development Kit)开发,学习的时候看教程中使用的是eclipse,但是我觉得有必要弄清楚在Android Studio上的开发过程,毕竟Android Studio才是Android开发的趋势所在。所以我上网查阅了一些资料,特意在此总结了一下在Android Studio中进行NDK开发的步骤,分享给各位初学者,

sinat_19385391的博客 7018

[Python图像处理] 二.OpenCV+Numpy库读取与修改像素

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分...

杨秀璋的专栏 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

用java开发一个简单的安卓程序,Android NDK开发简单程序分享(Hello Word!)

在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力。这里我们选择使用C+JAVA开发Android程序,首先你必须了解C语言、JAVA语言以及Linux操作系统,这样可以帮助你开始上手,当然不是说你必须是大牛才能进行NDK开发,下面我们来一起实现一个简单的NDK程序。第一步,创建Android工程...

weixin_35044595的博客 2283

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

windows下eclipse搭建android_ndk开发环境

安装cygwin: 由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,非常有用。通过它,你就

ygc87的专栏 9007

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android JNI和NDK 自动创建Hello world

前言:博主现在已经找到一份比较满意的工作,做的是偏底层的JNI方面的嵌入式软件开发。因此从现在开始将会持续跟新这方面的知识以巩固和提高。 Android NDK 与 JNI 为什么要有这两个?     对于Android的嵌入式软件开发、调用到硬件、与操作系统交互或者执行一些比较重要的行为来说,一般是通过与C或C++结合进行,通常的做法就是将编译好的动态库.so放到我们的Android APK中,然后加载该库进行调用即可,但是如果我们需要在我们的项目中编写自己的本地代码怎么办呢?这就需要用到两个东西:NDK

Eliza白的博客 650
上一篇: NDK Build 用法(NDK Build)
下一篇: 走进AndroidStudio下的NDK(一)
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值