返回顶部
首页 > 资讯 > 精选 >Android中JNI如何使用
  • 785
分享到

Android中JNI如何使用

2023-06-20 20:06:11 785人浏览 薄情痞子
摘要

Android中JNI如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.导入C语言的类首先我们需要把C语言写的功能类放入我们的项目中。这里我直接从资料中

Android中JNI如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1.导入C语言的类

首先我们需要把C语言写的功能类放入我们的项目中。这里我直接从资料中找了一个,毕竟我不会写。路径在src/main/jni中

find_name.cpp

#include <jni.h>#include <string.h> #include <stdio.h>#include <stdlib.h>#include <string.h>#include <netdb.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/select.h>#include <sys/Socket.h>#include <netinet/in.h>#include <arpa/inet.h> #define send_MAXSIZE 50#define recv_MAXSIZE 1024 struct NETBiOSNS {unsigned short int tid; //unsigned short int 占2字节unsigned short int flags;unsigned short int questions;unsigned short int answerRRS;unsigned short int authorityRRS;unsigned short int additionalRRS;unsigned char name[34];unsigned short int type;unsigned short int classe;}; char *getNameFromIp(const char *ip); extern "C" jstring Java_com_hao_cmake_MainActivity_cpuFromJNI(JNIEnv* env, jobject thiz, jstring ip) {const char* str_ip;str_ip = env->GetStringUTFChars(ip, 0);return env->NewStringUTF(getNameFromIp(str_ip));} char *getNameFromIp(const char *ip) {char str_info[1024] = { 0 };struct sockaddr_in toAddr; //sendto中使用的对方地址struct sockaddr_in fromAddr; //在recvfrom中使用的对方主机地址char send_buff[send_MAXSIZE];char recv_buff[recv_MAXSIZE];memset(send_buff, 0, sizeof(send_buff));memset(recv_buff, 0, sizeof(recv_buff));int sockfd; //socketunsigned int udp_port = 137;int inetat;if ((inetat = inet_aton(ip, &toAddr.sin_addr)) == 0) {sprintf(str_info, "[%s] is not a valid IP address\n", ip);return str_info;}if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {sprintf(str_info, "%s socket error sockfd=%d, inetat=%d\n", ip, sockfd, inetat);return str_info;}bzero((char*) &toAddr, sizeof(toAddr));toAddr.sin_family = AF_INET;toAddr.sin_addr.s_addr = inet_addr(ip);toAddr.sin_port = htons(udp_port); //构造netbios结构包struct NETBIOSNS nbns;nbns.tid = 0x0000;nbns.flags = 0x0000;nbns.questions = 0x0100;nbns.answerRRS = 0x0000;nbns.authorityRRS = 0x0000;nbns.additionalRRS = 0x0000;nbns.name[0] = 0x20;nbns.name[1] = 0x43;nbns.name[2] = 0x4b;int j = 0;for (j = 3; j < 34; j++) {nbns.name[j] = 0x41;}nbns.name[33] = 0x00;nbns.type = 0x2100;nbns.classe = 0x0100;memcpy(send_buff, &nbns, sizeof(nbns));int send_num = 0;send_num = sendto(sockfd, send_buff, sizeof(send_buff), 0,(struct sockaddr *) &toAddr, sizeof(toAddr));if (send_num != sizeof(send_buff)) {sprintf(str_info,"%s sendto() error sockfd=%d, send_num=%d, sizeof(send_buff)=%d\n",ip, sockfd, send_num, sizeof(send_buff));shutdown(sockfd, 2);return str_info;}int recv_num = recvfrom(sockfd, recv_buff, sizeof(recv_buff), 0,(struct sockaddr *) NULL, (socklen_t*) NULL);if (recv_num < 56) {sprintf(str_info, "%s recvfrom() error sockfd=%d, recv_num=%d\n", ip,sockfd, recv_num);shutdown(sockfd, 2);return str_info;}//这里要初始化。因为发现linux和模拟器都没问题,真机上该变量若不初始化,其值就不可预知unsigned short int NumberOfNames = 0;memcpy(&NumberOfNames, recv_buff + 56, 1);char str_name[1024] = { 0 };unsigned short int Mac[6] = { 0 };int i = 0;for (i = 0; i < NumberOfNames; i++) {char NetbiosName[16];memcpy(NetbiosName, recv_buff + 57 + i * 18, 16);//依次读取netbios nameif (i == 0) {sprintf(str_name, "%s", NetbiosName);}}sprintf(str_info, "%s|%s|", ip, str_name);for (i = 0; i < 6; i++) {memcpy(&mac[i], recv_buff + 57 + NumberOfNames * 18 + i, 1);sprintf(str_info, "%s%02X", str_info, mac[i]);if (i != 5) {sprintf(str_info, "%s-", str_info);}}return str_info;}

这里要注意一点,jstring Java_com_hao_cmake_MainActivity_cpuFromJNI方法中,com_hao_cmake是我们的包名,MainActivity是调用JNI的Activity名称,cpuFromJNI是对应方法的名字。

2.接着导入Android.mk文件

这个文件也是放在jni文件夹中

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) # 指定so库文件的名称LOCAL_MODULE    := jni_mix# 指定需要编译的源文件列表LOCAL_SRC_FILES := find_name.cpp# 指定c++的编译标志LOCAL_CPPFLAGS += -fexceptions# 指定要加载的静态库#LOCAL_WHOLE_STATIC_LIBRARIES += android_support# 指定需要链接的库LOCAL_LDLIBS    := -llog include $(BUILD_SHARED_LIBRARY)$(call import-module, android/support)

3.我们配置一下build.gradle文件

android  ->  defaultConfig 下添加

externalNativeBuild{    ndkBuild{        abiFilters "arm64-v8a","armeabi-v7a"    }}

android 下添加

externalNativeBuild {    ndkBuild {        path file('src/main/jni/Android.mk')    }}packaginGoptions{    pickFirst 'lib/arm64-v8a/libjni_mix.so'    pickFirst 'lib/armeabi-v7a/libjni_mix.so'}

4.好了,此时可以编译一下项目了

5.此时我们可以找一下我们生成的so包了

在build → intermediates → ndkBuild → debug → obj → local下,我们可以找到我们生成的相关配置平台的so文件

6.将生成的so文件拷入src/main/jniLibs中

这个样子的

Android中JNI如何使用

7.调用C语言方法的Activity如下

public class MainActivity extends AppCompatActivity {     public native String cpuFromJNI(String ip);     static {        System.loadLibrary("jni_mix");    }     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        String str = cpuFromJNI("192.168.0.163");        Toast.makeText(this,str,Toast.LENGTH_SHORT).show();    }}

这样我们就完成了用C语言类生成so包,并使用JNI进行调用的全流程。

注意:在使用JNI进行调用的时候,我们的环境一定要有NDK,这个我这里就不说了,大家如果没有搭建需要上网找找搭建一下。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: Android中JNI如何使用

本文链接: https://www.lsjlt.com/news/299776.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中JNI如何使用
    Android中JNI如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.导入C语言的类首先我们需要把C语言写的功能类放入我们的项目中。这里我直接从资料中...
    99+
    2023-06-20
  • Linux系统中如何使用JNI
    这篇文章将为大家详细讲解有关Linux系统中如何使用JNI,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确...
    99+
    2023-06-27
  • Android在JNI中使用ByteBuffer的方法
    本文实例讲述了Android在JNI中使用ByteBuffer的方法。分享给大家供大家参考。具体如下: 一、ByteBuffer 定义 在NIO中,数据的读写操作始终是与缓冲区...
    99+
    2022-06-06
    bytebuffer 方法 jni Android
  • 实例详解Android中JNI的使用方法
    目录前言1.导入C语言的类2.接着导入Android.mk文件3.我们配置一下build.gradle文件4.好了,此时可以编译一下项目了6.将生成的so文件拷入src/main/j...
    99+
    2024-04-02
  • JNI本地接口如何在Java中使用
    这篇文章将为大家详细讲解有关JNI本地接口如何在Java中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。详解Java 本地接口 JNI 使用方法对于Java程序员来说,Java语言的好处...
    99+
    2023-05-31
    java jni ava
  • Android中jni如何调试打印char阵列
    这篇文章将为大家详细讲解有关Android中jni如何调试打印char阵列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Android jni调试打印char阵列的实例详解前言:在android开发中,用...
    99+
    2023-05-30
    android jni
  • Android Studio中如何实现导入JNI生成的.so库
    这篇文章主要讲解了Android Studio中如何实现导入JNI生成的.so库,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。由于在原来的ADT的Eclipse环境中,用ndk_build工具生成了相应的各个....
    99+
    2023-05-30
    android jni roi
  • Android使用android studio配置并运行Jni详细流程
    前言: 本文章以Android Studio为IDE,以手动编译不使用cmake的方式为例,在某个已有普通android项目基础上,创建jni程序并运行。详细介绍以下内容: 1、环境配置(Android Studio、SDK、JDK、NDK...
    99+
    2023-10-06
    android android studio gradle
  • Android串口开发之使用JNI实现ANDROID和串口通信
    导语:Android串口通信在物联网、智能家居等领域具有广泛的应用。本文将详细介绍如何使用JNI技术实现Android设备与串口的通信,包括串口的打开、设置参数和读写数据等过程。 目录 一...
    99+
    2023-10-20
    android java android studio 串口通信 JNI
  • Android蓝牙使能流程图(Android Bluetooth enable) -- java & jni层
    在介绍Android enable流程之前,我们首先来看下Android的流程图 以上图示是android8以上的,主要跟Android8之前的架构在于Bluetooth stack跟vend...
    99+
    2023-09-01
    android bt 安卓蓝牙使能 安卓蓝牙初始化 android bt en Powered by 金山文档
  • android jni调用的方法是什么
    在Android中,JNI(Java Native Interface)是一种机制,用于在Java和本地代码(如C/C++)之间进行...
    99+
    2023-09-20
    android
  • Android JNI c/c++调用java的实例
    Android JNI c/c++调用java的实例近期通过研究SDL源码 得出Android JNI  c/c++调用Java 无需新建虚拟机,这样省去很多步骤,这样调用Android JNI会变得非常容易,大家看下简单实例:具...
    99+
    2023-05-31
    android jni java
  • Android Studio应用中的so库怎么利用JNI生成
    这篇文章给大家介绍Android Studio应用中的so库怎么利用JNI生成,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.新建Android studio工程2.新建class:AppKey.java.主要为了保...
    99+
    2023-05-31
    android studio so库 jni
  • Android中如何使用Html.fromHtml
    Android中如何使用Html.fromHtml,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 设置字体颜色的时候,颜色值需要用到转义符:如下代码所示:String&nb...
    99+
    2023-05-31
    android html.fromhtml
  • Android中selector如何使用
    今天就跟大家聊聊有关Android中selector如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android  selector的详解前言:StateListD...
    99+
    2023-05-30
    android selector
  • Android中RecyclerView如何使用
    本篇文章给大家分享的是有关Android中RecyclerView如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。RecyclerView 是在Android suppo...
    99+
    2023-05-30
    android recyclerview
  • Android中AudioTrack如何使用
    Android中AudioTrack如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、Android AudioTrack简介在android中播放声音...
    99+
    2023-05-30
    android
  • Android中SharedPreferences如何使用
    本篇文章为大家展示了Android中SharedPreferences如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android  SharedPreferences详解获取Sh...
    99+
    2023-05-30
    android sharedpreferences
  • Android中OkHttpUtils如何使用
    Android中OkHttpUtils如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。引入:Android Studio使用前,对于Android Studio的用户,可...
    99+
    2023-05-30
    android okhttputils
  • Android中EfficientAdapte如何使用
    今天就跟大家聊聊有关Android中EfficientAdapte如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android ListView之EfficientAdapt...
    99+
    2023-05-30
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作