关于创建android jni实例

JNI编程示例 源代码地址: 链接:百度网盘 请输入提取码 提取码:gtlz 一、Demo介绍 为了更深入的理解Jni编程知识,我们通过一个简单demo把相关知识用实际代码串起来,会有更清晰的认识。在这个demo中,涉及数组处理、字符串处理、类成员变量访问修改等内容,基本涵盖了常见的用法。 相关介绍 涉及文件 (java代码/xml布局文件) demo界面示例 主界面 点击button进入对应示例 s 阅读详情

搭建环境

sdk 路径设置 sdktools下载
NDK 配置 在 系统path中加入
判断安装好标志 在terminal输入ndk-build命令
这里写图片描述
在项目project structure中如下
这里写图片描述
这里写图片描述
java环境
报错 javah 不是内部命令 环境没配置好
填写系统环境path路径的时候 在编辑文本中看一眼,或者在AS客户端的terminal中echo %path% 确定对不对,中间分号间隔
这里写图片描述

创建工程

1.创建一个工程,名字随便,

eg. TestDemo1,勾选include c++;空活动;
下一步,直到最后勾选Expections surport, runtime(非必须);

2.创建
建立一个jniutil.java
任意目录下 创建java类 (本文目录为TestDemo1\app\src\main\java)
Demo1.java

package com.example.tsing.testdemo1;

/**
 * Created by Tsing on 10/19/2017.
 */

public class Demo1 {
    static {
        System.loadLibrary("testdemo1");
    }
    public static native String sayHello();
}

注意 static中System.loadLibrary(“testdemo1”); 必须加上这句话,以后才可以引用
testdemo1是后来的so文件名称,必须一致
然后Clean Project,Rebuild Project,之后,你就能在项目的路径:app\src\main\java\看到 com.example.tsing.testdemo1.Demo1.class(或 com目录下)

2.生成h文件

进入AS的terminal cd 目录地址 到com上层目录截至 (防止出现找不到路径), javah 文件名 不可以带class(最终生成h文件就是在这个目录)

F:\AndroidStudioProjects\TestDemo1>cd app\src\main\java

F:\AndroidStudioProjects\TestDemo1\app\src\main\java
>javah -jni com.example.tsing.testdemo1.Demo1

3.以上操作如果没有问题的话,就会生成h文件

com_example_tsing_testdemo1_Demo1.h文件。在项目的src/main下面建立一个jni文件夹,将生成的com_example_tsing_testdemo1_Demo1.h文件拷贝进去。
新建jni文件夹

在jni文件夹里面,新建一个与.h对应的.c文件,名字可以随便,我取得名字为:main.c,加入以下代码:(确保与h中声明函数相对应,否则会报错)

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


/*
 * Class:     com_example_tsing_testdemo1_Demo1
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_tsing_testdemo1_Demo1_sayHello
        (JNIEnv *env,jclass jclass){
    return (*env)->NewStringUTF(env,"JNi success");
}

4、Jni类的配置及引用

在项目app下的build.gradle下面配置ndk:
在defaultConfig中插入ndk片段

ndk{
            moduleName "testdemo1"
             //生成的so名字
            ldLibs "log","z","m"
            abiFilters "armeabi","armeabi-v7a","x86"
            //输出指定三种abi体系结构下的so库,目前可有可无。
        }

这里写图片描述

5在gradle.properties加入配置

android.useDeprecatedNdk=true

问题 make project 此时如果生成so文件,在app\build\intermediates\ndk->debug->lib下,如果此时没有,说明ndk配置有误,尝试ndk手工编译

ndk-build命令编译

用ndk-build 生成“so”文件,我们还需要在“jni”目录中创建两个文件,分别是Android.mk和Application.mk。下面分别看看他们的具体实现!
Application.mk,这个文件用来配置编译平台相关内容,我们最常用的估计只是APP_ABI字段,它用来指定我们需要基于哪些CPU架构的.so文件,当然你可以配置多个平台。下面指定了两个平台。

APP_ABI := armeabi armeabi-v7a

Android.mk,文件用来指定源码编译的配置信息,例如工作目录,编译模块的名称,参与编译的文件等。

include $(CLEAR_VARS)  
LOCAL_MODULE    := calculate_jni  
LOCAL_SRC_FILES := cn_xinxing_jnitest_CalculateUtils.cpp  
include $(BUILD_SHARED_LIBRARY)  
    LOCAL_PATH:设置工作目录,而my-dir则会返回Android.mk文件所在的目录。
    CLEAR——VARS:清除几乎所有以LOCAL开头的变量(不包括LOCAL_PATH)。
    LOCAL_MODULE:指定生成动态库名。
    LOCAL_SRC_FILES:用来指定生成动态库的源文件   。
    BUILD_SHARED_LIBRARY:作用是指定生成的静态库或者共享库在运行时依赖的共享库模块列表。

按照上面的步骤,创建并输入相应的内容后,我们就可以生成“so”文件了。 打开Terminal,cd到工程的“src/main/jni”目录,输入“ndk-build”命令后,回车,如果你看到下面的截图,那就编译成功了(如没安装成功,提示无法识别,可利用ndk本机安装位置,输入D:\android-sdk\Sdk\ndk-bundle\ndk-build 命令)
这里写图片描述

这里写图片描述

在main目录下建立jniLibs文件夹,将生成的libs文件夹内内容复制到里面,即将so库复制里面,即可在函数中调用

这里写图片描述

6.在MainActivity中调用:

1.在static中加载库 这步可有可没有

 static {
    //    System.loadLibrary("native-lib");
        System.loadLibrary("testdemo1");
    }

2.在oncreat代码部分如下,其中Demo1为类,sayhello为其中的方法

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

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(Demo1.sayHello());
    }

这里写图片描述

7.工程目录结构

这里写图片描述

8.工程链接

git项目代码
git地址
git@github.com:ForeverEighteen/TestDemo1.git

9.android studio生成apk在哪?

app/build/outputs/apk

10.jni原理

首先编辑java类 ,static引用 生成的so库,声明相关函数是native。之后利用javah编译生成h文件,在编辑相应的c文件include 这个h文件,在文件中定义相关的函数。最后在MainActivity中就正常可以调用这个函数了。

arm cortex a53架构

这里写图片描述
这里写图片描述

问题 include头文件是红色


在app的build.gradle文件中android 下加入
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}

问题 新建文件没有被工程包含

修改cmake文件
cmakelists 文件内容如下


add_library(  myapplication3
             SHARED
             src/main/jni/jnitil.c )

find_library(  log-lib
                         log )

target_link_libraries( 
                       myapplication3
                          ${log-lib} )

so引用

修改buiid.gradle,添加.so引用路径


sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}

android studio nd开发到底要不要自己配置.mk文件

Android Studio 可以配置build.gradle , main/jni文件夹中的c/c++文件会自动打包成so,但是如果有不同模块的文件,要编译出多个so文件,就不知道在gradle文件中咋配置了(可能也可以配置),这时就可以用原来eclipse的写法;
main/jni文件夹按照原来eclipse的方法去写Android.mk和Application.mk,然后在main目录下执行ndk-build命令,该目录下会创建libs目录,里边就是生成的so,将项目配置的jniLibs.srcDirs指向src/main/libs就行;
这时有几个问题,一个是AS会自动重复编译jni中的文件,打包后会多一个没用的so,还有如果用了第三方的so文件会和自己项目的so文件冲突,因为每次ndk-build后都会删除原来文件夹中的其他so文件.
先去掉 defaultConfig中的ndk配置,然后配置 :
sourceSets{
main{
//指定so库的位置,前边的是自己项目的,后边的是第三方的so
jniLibs.srcDirs=[‘src/main/libs’,’libs’]
//禁止 android studio 自动编译
jni.srcDirs=[]
}
}

Android Studio开发JNI示例 JNI和NDK介绍 JNI(Java Native Interface),是方便Java调用C、C++等Native代码所封装的一层接口,相当于一座桥梁。通过JNI可以操作一些Java无法完成的与系统相关的特性,尤其在图像和视频处理中大量用到。 NDK(Native Development Kit)是Google提供的一套工具,其中一个特性是提供了交叉编译,即C或者C++不是跨平台的,但通过N... 阅读详情

相关推荐

JNI示例的源码

两个JNI的示例实现的代码,主要实现了一个没有参数没有返回值的native方法和有参数且有返回值的native方法

JNI 简单示例

JNI即Java Native Interface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库),或者C/C++调用Java代码。本文主要介绍通过JNI实现java调用C/C++ 通过Java jni来调用native code,需要如下几个步骤: 编写java代码,使用native关键字声明本地方法接口(例如:native void printstr(S...

赶路人儿 1336

JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)

一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList>等。

JNI全流程实例使用总结

为了更好的获得一些比较独立的模块的性能,比如视频模块,寻路模块,通过对C++ 接口的封装,通过JNI技术对它进行跨语言调用。 那什么是JNI呢?JNI (Java Native Interface,Java本地接口)是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用/或库,也可以被其他程序调用。 本地程序一般是用其它语言(C、C++或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序。.....................

流子的专栏 3052

JNI实例

NULL 博文链接:https://995215629-qq-com.iteye.com/blog/2170459

jni最简单例子,注释详细

jni最简单例子,注释详细

安卓项目易用Ohttp封装

在android中的网络请求如果用Handler来传,看代码跳来跳去太累。首先呢,这个是我实际项目中的封装,各位不用担心能不能用的问题。支持的功能:1.无缝在主线程调用回到主线程 2.自动Gson泛型机械,并支持到二级泛型 3.支持Activity结束时,取消所有创建的网络操作 4.支持单个网络操作取消 5.使用链式调用,使用方便Get请求HttpUtil.newBuilder(this)/

Android程序员的博客 2270

JNI_AndroidStudio 的创建过程

这里有jni项目的创建过程

JNI的代码示例

打开刚创建的ideal项目中生成的edu_hut_JNIDemo.h文件,全选里面的内容。找到你本地安装的jdk的include项目目录和jdk的include下面win32目录。在JNI中补充如下代码,System.load()里面写Dll3.dll的路径。把Dll3.h文件下的函数名复制到Dll3.cpp中,并书写处理逻辑。把鼠标移动到edu.hut软件包上面,新建一个终端终端。粘贴到Dll3.h文件中的#endif下方。选择具有导出的DLL的动态链接库的模板。在头文件中打开Dll3.h头文件。

w14727619798的博客 652

【SLG游戏服务器开发手册】(ROK Like)沙盘地图篇一,菱形瓦片与笛卡尔坐标系的转换(附调试工具)

轴向坐标:以菱形网格对角方向为基准轴,记作(q, r)菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)

代码时光 979

为什么需要知识图谱?什么是知识图谱?——KG的前世今生

我的知乎专栏,对知识图谱感兴趣的朋友可以关注。标题的命名顺序可能让有的读者不太习惯。通常在介绍一个陌生事物的应用前,我们先给出其定义。之所以换个顺序,是为了不让读者一开始就接触比较冰冷生硬的概念刻板描述(后面我尽量用更具体、准确的例子来表达),另一方面也是为了通过现实生活中的例子自然的引入知识图谱的概念。希望通过这种方式加深读者的印象和理解。为了减轻读者理解的负担,我尽可能地避免引入过多的概念和技术

SimmerChan的专栏 8万+

Android中JNI创建实例

参考文档: http://blog.sina.com.cn/s/blog_a11f64590101924l.html http://www.cnblogs.com/hoys/archive/2010/10/28/1863612.html http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html http://blog.cs

wikiday的专栏 9795

常用元器件使用方法36:USB转串口芯片CH340X

本文介绍了CH340X芯片的使用方法

snmplink的博客 2827

游戏设计大赛技术评审指南:避免不合理落榜的代码规范与性能优化

游戏开发中的代码规范与性能优化是确保项目质量的核心技术概念。良好的代码规范遵循模块化设计原则,通过清晰的命名、注释和架构分层,提升代码可读性和可维护性。性能优化则涉及帧率稳定、内存管理和加载效率等关键技术指标,直接影响用户体验。在游戏设计大赛的技术评审中,评审机制通常采用多轮筛选,重点关注代码质量、技术实现难度和性能表现。参赛者需要掌握评审标准权重分配,理解技术创新、游戏设计、美术表现等维度的考察重点。通过系统化的技术准备,包括代码规范检查、性能测试和兼容性验证,可以有效避免因技术实现问题导致的不合理落榜情

weixin_34150830的博客 420

获取iOS设备唯一标识UUID(Swift版)

属性返回的UUID是与应用程序相关联的,也就是说,如果用户卸载并重新安装应用程序,该UUID可能会发生变化。如果您需要一个与设备相关的持久唯一标识符,您可以考虑使用Keychain或其他方法来存储和检索设备标识符。在iOS开发中,我们经常需要获取设备的唯一标识符来进行一些特定的操作,比如设备识别、数据追踪等。在本文中,我将向您展示如何使用Swift编程语言获取iOS设备的唯一标识UUID。通过上述代码,您可以在您的iOS应用程序中轻松获取设备的唯一标识符。属性来获取设备的唯一标识UUID。

BitNetO的博客 1918

在线考试题库抓取:Python 爬虫抓取各类在线考试平台题库和试题

通过这些技术,您可以抓取各类在线考试平台上的题库数据,进行数据分析、生成练习题集,甚至用于考试准备。为了演示抓取过程,本篇博客选择了两个常见的在线考试平台进行数据抓取:一个是教育考试平台(如“中小学题库”),另一个是职业考试平台(如“华图教育”)。对于这些网站,我们需要找到包含题库信息的页面,并分析每一页的 HTML 结构,从而定位到题目、选项、答案等数据。大多数在线考试平台的题库是分页显示的,因此我们需要遍历多个页面,抓取所有的题库数据。因此,我们需要设置合适的请求头来模拟真实的浏览器请求。

2201_76125261的博客 3430

Android 中JNI创建实例

Android开发之使用AndroidStudio开发工具实现JNI的开发 标签: AndroidStudiojnindknative 2016-06-02 16:38 2384人阅读 评论(2) 收藏 举报 分类: Android开发之使用AndroidStudio开发工具实现JNI的开发 版权声明:本文为博主原创文章,未经博主允许不...

weixin_33860737的博客 234

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 114

Qt for android : 简单实现弹窗创建文件,并使用JNI进行读写实例

Qt for android 6.6.2: JNI打开系统文件管理器创建文件,并简单读写实例

听我一言的博客 935

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

安卓高版本c/c++调用java,通过JNI_CreateJavaVM/JNI_GetCreatedJavaVMs创建虚拟机实例

c/c++调用java;JNI_CreateJavaVM/JNI_GetCreatedJavaVMs创建虚拟机实例;libnativehelper; JNI_CreateJavaVM运行挂载libart

我的博客 2422

WINCC7.3破解文件

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

cocos2dx jni 调用java,cocos2dx 与android函数的互相调用及使用jni

cocos2dx 与android函数的相互调用及使用jni哈喽大家好 ,之前一阵子一直在忙项目,没怎么发过博文,挺想看看cocos2dx与安卓是如何交互的,所以就学习了一下(因为我是小菜嘛 想多学点东西 嘻嘻!!!)做了这么一个小test,虽然不多代码但小菜弄了许久,发上来给大家分享下如果有什么错误或建议欢迎大家为我指出来啊 小菜感激不尽。。。其实一开始是在想如何在cocos2dx中加入广告及第...

weixin_39782433的博客 199

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

安卓studio jni 简单实例demo

安卓studio jni 简单实例 标签(空格分隔): jni 1.Jni 是java native Interface 就是java本地接口,接口就是语言链接的入口。 在安卓中 我们首先写好c文件,然后编译成linux平台的so文件库。 现在,我写一个例子来说: 首先,我们定义一个本地方法,函数内容用C语言来实现/ 新建一个空,新建一个class,自己定义...

blithe影子 1201
上一篇: 工具
下一篇: 关于安卓手机 的调试
forevertingting
博客等级 码龄12年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值