使用Eclipse和NDK开发Android JNI工程

Android NDK开发(一)环境搭建及运行示例 1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。注:1.在android-ndk-r10c目录下有一个samples的目录,里面存放着例子,可供学习。 阅读详情

基本流程:
1.新建Android工程
2.Java文件中创建调用接口声明代码
3.javah生成C/C++的.h文件
4.编写C/C++实现代码
5.编写Android.mk脚本
6.编写Application.mk脚本
7.使用ndk编译工程生成.so动态库
8.编写加载库的代码载入.so文件
9.调用动态库的接口方法

详细流程:
1.新建工程,并对ndk进行配置

工程AndroidJniTest

右键选择工程属性,按照图中1,2,3步骤

右键选择工程属性

双击工程Builder,选择ndk-build.cmd所在路径以及工程的工作目录

这里写图片描述

按照如图所示配置ndk执行

这里写图片描述

这里写图片描述

点击Specify Resources按钮

这里写图片描述

2.创建com.example.jni包,并创建TestJNI.java文件,声明接口,内容如下:

package com.example.jni;

public class TestJNI {
     public native boolean init();
     public native int add (int x, int y);
     public native void destroy();
}

3.使用命令:javah -classpath bin/classes -d jni com.example.jni.TestJNI
生成jni调用的.h文件,叫com_example_jni_TestJNI.h
参数解释:
-classpath 使用类的位置
-d jni需要生成jni的类,包括包名+类名
这个.h文件里面的内容如下:

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

#ifndef _Included_com_example_jni_TestJNI
#define _Included_com_example_jni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_TestJNI
 * Method:    init
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_example_jni_TestJNI_init
  (JNIEnv *, jobject);

/*
 * Class:     com_example_jni_TestJNI
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_jni_TestJNI_add
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     com_example_jni_TestJNI
 * Method:    destroy
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_jni_TestJNI_destroy
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4.编写实现这些接口的C++代码
首先是Add.h,代码如下:

#ifndef JNI_TEST_ADD
#define JNI_TEST_ADD
class CAdd {
public:
     CAdd();
     ~CAdd();
     int add(int x, int y);
};
#endif

然后是Add.cpp,代码如下:

#include "Add.h"
CAdd::CAdd (){

}
CAdd::~CAdd (){

}
int CAdd::add( int x, int y){
     return x+y;
}

最后是com_example_jni_TestJNI.cpp,代码如下:
PS:最好先把.h的代码先复制下来,然后再进行改动,防止缺少什么。
比如缺少jni.h和extern”C”都会有相应的问题(JNI_EXPORT/Native method not found等),导致不能编译成功

#include<stdio.h>
#include <stdlib.h>
#include <jni.h>
#include "Add.h"

#ifndef _Included_com_example_jni_TestJNI
#define _Included_com_example_jni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif

CAdd *pcAdd = NULL;

/*
 * Class:     com_example_jni_TestJNI
 * Method:    init
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_example_jni_TestJNI_init
  (JNIEnv *env, jobject object){
     if(pcAdd==NULL){
           pcAdd = new CAdd;
     }
     return pcAdd!=NULL;
}

/*
 * Class:     com_example_jni_TestJNI
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_jni_TestJNI_add
  (JNIEnv *env, jobject object, jint x, jint y){
     jint res = -1;
     if(pcAdd != NULL){
           res = pcAdd->add(x,y);
     }
     return res;
}

/*
 * Class:     com_example_jni_TestJNI
 * Method:    destroy
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_jni_TestJNI_destroy
  (JNIEnv *env, jobject object){
     if(pcAdd != NULL){
            delete pcAdd;
           pcAdd = NULL;
     }
}

#ifdef __cplusplus
}
#endif
#endif

5.编写Android.mk和Application.mk文件
(Android.mk和.cpp可以通过右键项目->Android Tools->Add Native Support生成)

Android.mk内容:

LOCAL_PATH := $(call my-dir) #Android.mk的目录路径

include $(CLEAR_VARS) #清理LOCAL_xxx避免相互影响

LOCAL_MODULE    : = TestJNI #要生成的动态库名称

### Add all source file names to be included in lib separated by a whitespace
LOCAL_SRC_FILES := com_example_jni_TestJNI.cpp\
Add.cpp #要编译的jni和底层源码

include $(BUILD_SHARED_LIBRARY) #生成动态库

Application.mk内容:

APP_STL := gnustl_static #使用STL库
APP_CPPFLAGS += -fpermissive #忽略一些语法错误,兼容老语法使其通过

makefile文件参数的解释:
Android NDK学习 <二> Android.mk的制作
Android NDK开发指南(一) Application.mk文件

Android.mk告诉NDK Build系统关于Source的信息。Android.mk将是GNU Makefile的一部分,且将被Build System解析一次或多次。所以,尽量少的在Android.mk中声明变量,也不要假定任何东西不会在解析过程中定义。

LOCAL_PATH := $(call my-dir)

每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS)

CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH. 这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE := TestJNI

LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so.
但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

LOCAL_SRC_FILES := 
com_example_jni_TestJNI.cpp\ #\和回车隔开
Add.cpp

LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。

APP_STL :默认,NDK构建系统提供由Android系统给出的最小C++运行时库(/system/lib/libstdc++.so)的C++头文件。
然而,NDK带有另一个C++实现,你可以在你自己的应用程序中使用或链接它。
定义APP_STL以选择它们其中的一个:
APP_STL := stlport_static –> static STLport library
APP_STL := stlport_shared –> shared STLport library
APP_STL := system –> default C++ runtime library

APP_CFLAGS : 一个C编译器开关集合,在编译任意模块的任意C或C++源代码时传递。
它可以用于改变一个给定的应用程序需要依赖的模块的构建,而不是修改它自身的Android.mk文件

6.编译工程,生成动态链接库.so文件
一般改完会自动编译,如果没有反应可以在cmd中跳转到jni目录,使用ndk-build对工程进行编译,这一方法在Android Studio中同样适用。

7.调用.so文件,运用在Activity中
其MainActivity.java内容如下:

package com.example.androidjnitest;

import com.example.jni.TestJNI;

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

public class MainActivity extends Activity {

     static{
           System. loadLibrary("TestJNI");
     }

     TextView tv_test;

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

           InitView();
           TestJNI jni = new TestJNI();
           jni.init();
            tv_test.setText( "1+1="+jni.add(1,1));
     }

     void InitView(){
            tv_test = (TextView) findViewById(R.id. tv_test);
     }
}

将其发布到手机或者Android虚拟机上即可看见结果。

【愚公系列】2023年06月 移动安全之安卓逆向(前提概念) IDA(Interactive Disassembler)是一款逆向工程领域常用的反汇编软件。它可以将二进制文件反编译成汇编代码,让逆向工程师可以查看和理解程序的工作原理。IDA可以解析C/C++语言结合ARM汇编的代码。在反汇编ARM二进制代码时,IDA可以识别出程序中的函数、变量和数据结构,并且可以根据程序流程图和调用关系图来分析程序结构。同时,IDA还支持对汇编代码的注释和标记,让逆向工程师可以更快速、更准确地理解程序功能。 阅读详情

相关推荐

VLC Android开发实战工程(基于Eclipse IDE)

VLC(VideoLAN Client)是一款开源、跨平台的多媒体播放器,广泛应用于桌面和移动设备。其Android版本基于原生C++代码(libVLC)封装,通过JNI与Java层交互,实现了强大的音视频解码能力。VLC for Android不仅支持几乎所有的音视频格式,还具备良好的硬件加速性能,适用于视频播放器、直播应用、多媒体框架开发等多个场景。该工程采用模块化设计,核心逻辑由C/C++实现,播放控制层由Java实现,便于开发者进行功能扩展与性能优化。

weixin_32324637的博客 620

JNI开发(二) 在JNI开发中调用第三方so库

既然用到了JNI,那不妨可以再踏深一步,如果有个需求是要求你去装饰一个SO库,或者是封装几个SO库。那这篇文章一定要看。跟上一章一样,在build.gradle添加sourceSets{ main{ jni.srcDirs=[] //不使用gradle编译本地c/c++代码 jniLibs.srcDirs = ['libs','

MonkeZ的博客 2111

android eclipse jni(ndk) 开发环境的搭建

网上有关在linux中讲android jni(ndk) eclipse开发环境的搭建的资料有很多,但大多都非常的繁琐,本来是简单的事情描述的却很复杂。下面结合我的实际把步骤写出来,其实很简单一步就可完成……

JNI的使用(一)

Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。 关于Android的JNI知识可以参考这篇文章:http://blog.youkuaiyun.com/li

LingXiaokai的博客 455

Eclipse NDK 开发之 HelloWorld

Eclipse NDK 开发之 HelloWorld。 详细说明,见相关博客。

Eclipse里Android JNI的开发方法

NDK开发环境安装和一个简单的JNI例子

Java中使用JNI调用本地动态库的方法(图文详解加代码示例)

在Java中,要使用动态库,就要使用到 JNI。首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。 使用java与本地已编译的代码交互,通常会丧失平

招财猫_Martin 的专栏 1万+

Zemax操作33--5倍激光扩束器

5倍扩束

lzy750750的博客 2931

Eclipse开发NDK

1. 概念了解: 交叉编译: 在一个平台下,编译另外一个平台能够执行二进制的代码 windows下编译 成android 平台可以运行的汇编 工具: ndk cdt: Eclipse开发c/c++插件 , 如果eclipse没有安装需要安装,查看是否安装该插件 ##NDK目录结构 * docs:帮助文档: HOW TO:相当于index * ...

dreams_deng的博客 2726

医疗设备安规入门:一张图搞懂BF型设备的MOOP/MOPP绝缘路径(附GB 9706.1附录解析)

本文深入解析了BF型医疗设备的MOOP/MOPP绝缘路径设计,结合GB 9706.1标准附录J的实战应用,帮助工程师快速掌握医疗设备安规要点。通过典型绝缘路径图分析,详细对比了MOOP与MOPP的防护差异,并提供了海拔修正、漏电流测试等关键设计指南,助力医疗设备安全合规。

weixin_30633405的博客 386

AutoSAR开发实战:如何用Matlab/Simulink从零搭建SWC组件(附完整代码示例)

本文详细介绍了使用Matlab/Simulink从零开发AutoSAR SWC组件的全流程,包括环境配置、ARXML文件导入、算法模型开发、代码生成与集成验证等关键步骤。通过实战案例和完整代码示例,帮助开发者掌握AutoSAR标准下的软件开发技术,提升汽车电子系统的开发效率。

weixin_29093017的博客 256

09.Android之NDK-r7基础与实例

一、关于NDK: NDK全称:Native Development Kit。 1、NDK是一系列工具的集合。 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要

jjunjoe的专栏 3654

泛微ecology9 HRMwebservice接口实战:企业组织架构与人员信息同步指南

本文详细介绍了泛微ecology9 HRMwebservice接口在企业系统集成中的实战应用,重点解析了如何通过该接口实现组织架构与人员信息的双向同步。内容涵盖环境配置、核心接口调用、数据格式规范及常见错误排查,旨在帮助开发与运维工程师高效完成主数据同步,提升企业IT管理效率。

weixin_29323365的博客 498

Linux 环境下如何使用NDK进行Android开发

下载NDK

不想做段子手的攻城狮不是好的运动员 1413

【WB32库开发】第9章 TIM1高级定时器——输出多路PWM

PWM(Pulse Width Modulation)意为脉冲宽度调制,简称脉宽调制 。在工控行业,PWM信号可以用来调节电机转速、调节变频器以及BLDC电机驱动等;在LED照明行业,可以通过PWM来控制LED的亮暗变化;还可以通过PWM信号来控制无源蜂鸣器发出简单的声音等。 WB32也可输出PWM,需配置WB32上的定时器。 在WB32中有4个定时器,其中TIM1为高级定时器,TIMx(2-4)为通用定时器,这四个定时器均挂载在APB1总线上,每个定时器都可以输出4路PWM。 本章需要使用固件库TIM例程

北海村夫的博客 4637

YOLOv13优化:PoolingFormerCGLU模块 MetaFormer 框架 + 池化混合器 手把手教你自注意力

PoolingFormer1 是一个基于 MetaFormer 框架 的轻量化卷积-Transformer 混合模块,通过 Pooling 取代自注意力,实现: 更低的计算成本 一定的全局信息融合 兼容 CNN 和 Transformer 的优点

FJN110的博客 425

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

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

weixin_35044595的博客 2283

风控域——决策引擎系统设计

本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具,可自动化、数据驱动地辅助或替代人工决策,广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能,包括自动化决策、动态规则管理、实时处理和模型集成,以及系统组成,涵盖数据输入层、规则引擎和模型服务层。此外,还探讨了决策引擎的典型应用场景、技术架构、组件设计,以及风控决策引擎系统的技术方案、设计难点和重点。

庄小焱 3316

android java函数_Android NDK 学习之调用Java函数

本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件。在Eclipse中添加配置NDK,路径如下Eclipse->Window->Preferences->Android->NDK ,选择NDK的路径,然后Apply即可。新建一个名为AndroidJNI_MethodCall的Android工程...

weixin_28950415的博客 287

yolov8 转华为昇腾om脚本

yolov8 转华为昇腾om脚本

jacke121的专栏 1601

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Eclipse NDK安装流程详解

今天重新安装android开发的环境,对NDK的安装环境还不太熟,查了好一段时间。发现之前会的东西如果不加以记录的话很容易忘记,因此重新整理了一下自己安装NDK的过程。之前安装eclipse和ADT的过程大家都懂,这里就不做介绍了。在安装完Eclipse和ADT后,便可直接进入安装NDK的流程。

bestboyxie的专栏 2273

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JNI使用

一、NDK环境搭建 NDK(Native Development Kit):Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C/C++之类的原生代码语言执行部分程序。Google改良了NDK的开发流程,对于windows环境下NDK的开发,在使用NDK r7之后的版本可以不再需要cygwin;因此本文是基于NDKr8e进行开发的。 1、下载NDK NDK的下载可以在其

C_Dreams的博客 651

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android NDK 学习之接受Java传入Object数组

本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件。 在Eclipse中添加配置NDK,路径如下Eclipse->Window->Preferences->Android->NDK ,选择NDK的路径,然后Apply即可。 新建一个名为AndroidJNI_ObjectArray的Android工程,新建

雪夜&流星的专栏 661

Android NDK 学习之接受Java传入的字符串

本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件。 在Eclipse中添加配置NDK,路径如下Eclipse->Window->Preferences->Android->NDK ,选择NDK的路径,然后Apply即可。 新建一个名为AndroidJNI_Prompt的Android工程,新建一个jni

雪夜&流星的专栏 615

Eclipse NDK环境搭建

 前言     使用最新NDK,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),下载NDK,还要配置编译器,环境变量,特别麻烦,新版就不需要了。 工具     NDK,官方下载地址由于墙的原因不好打开,就在http://www.androidde

dongsheng186的专栏 538
上一篇: HTK语音识别HResults的结果解释
下一篇: WAV格式文件分析
llearner
博客等级 码龄11年 23粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值