JNI笔记
JNI笔记
- 背景
- Demo代码
- JNI.java
- MainActivity.java
- Android.mk
- Application.mk
- com_stone_javacallc_JNI.h
- javacallc.c
- build.gradle
背景

Demo代码
代码结构

JNI.java
package com.stone.javacallc;/*** Created by stoneWang* Created on 2024/1/16* java调用C*/
public class JNI {{System.loadLibrary("javacallc");}/*** 让C代码做加法运算,把结果返回** @param x* @param y* @return*/public native int add(int x, int y);/*** 从Java传入字符串,C代码进行拼接** @param s I am from java* @return I am from java add I am from C*/public native String sayHello(String s);/*** 让C代码给每个元素加上10** @param intArray* @return*/public native int[] increaseArrayEles(int[] intArray);
}
MainActivity.java
package com.stone.javacallc;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;public class MainActivity extends AppCompatActivity {private JNI jni;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);jni = new JNI();}public void add(View view) {int result = jni.add(99, 1);Log.e(MainActivity.class.getSimpleName(), "result:" + result);}public void string(View view) {String result = jni.sayHello("I am from java ");Log.e(MainActivity.class.getSimpleName(), "result:" + result);}public void array(View view) {}public void checkpw(View view) {}}
Android.mk
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=javacallc
LOCAL_SRC_FILES :=javacallc.c
include $(BUILD_SHARED_LIBRARY)
Application.mk
App_ABI:=all
com_stone_javacallc_JNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_stone_javacallc_JNI */#ifndef _Included_com_stone_javacallc_JNI
#define _Included_com_stone_javacallc_JNI
#ifdef __cplusplus
extern "C" {
#endif
/** Class: com_stone_javacallc_JNI* Method: add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_com_stone_javacallc_JNI_add(JNIEnv *, jobject, jint, jint);/** Class: com_stone_javacallc_JNI* Method: sayHello* Signature: (Ljava/lang/String;)I*/
JNIEXPORT jstring JNICALL Java_com_stone_javacallc_JNI_sayHello(JNIEnv *, jobject, jstring);/** Class: com_stone_javacallc_JNI* Method: increaseArrayEles* Signature: ([I)[I*/
JNIEXPORT jintArray JNICALL Java_com_stone_javacallc_JNI_increaseArrayEles(JNIEnv *, jobject, jintArray);#ifdef __cplusplus
}
#endif
#endif
javacallc.c
//
// Created by wanglei on 2024/1/16.
//
# include "com_stone_javacallc_JNI.h"
# include "string.h"/*** 把一个jstring转换成一个c语言的char* 类型.*/
char* _JString2CStr(JNIEnv* env, jstring jstr) {char* rtn = NULL;jclass clsstring = (*env)->FindClass(env, "java/lang/String");jstring strencode = (*env)->NewStringUTF(env,"GB2312");jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid, strencode); // String .getByte("GB2312");jsize alen = (*env)->GetArrayLength(env, barr);jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);if(alen > 0) {rtn = (char*)malloc(alen+1); //"\0"memcpy(rtn, ba, alen);rtn[alen]=0;}(*env)->ReleaseByteArrayElements(env, barr, ba,0);return rtn;
}/**** @param env* @param jobj* @param ji* @param jj* @return*/
jint Java_com_stone_javacallc_JNI_add(JNIEnv *env, jobject jobj, jint ji, jint jj){int result = ji + jj;return result;
};jstring Java_com_stone_javacallc_JNI_sayHello(JNIEnv *env, jobject jobj, jstring jstr){char* fromJava = _JString2CStr(env, jstr);char* fromc = "add I am from C";// 拼接函数strcatstrcat(fromJava, fromc); // 把拼接的结果放在第一参数里面// 将char转为jstringreturn (*env)->NewStringUTF(env, fromJava);
};
build.gradle
apply plugin: 'com.android.application'android {compileSdkVersion 30buildToolsVersion "30.0.2"defaultConfig {applicationId "com.stone.javacallc"minSdkVersion 26targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"ndk{moduleName "javacallc"abiFilters "armeabi", "armeabi-v7a", "arm64-v8a" // cpu类型}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {ndkBuild {path "src/main/jni/Android.mk"}}
}dependencies {implementation fileTree(dir: "libs", include: ["*.jar"])implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.1'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'}相关文章:
JNI笔记
JNI笔记 背景Demo代码JNI.javaMainActivity.javaAndroid.mkApplication.mkcom_stone_javacallc_JNI.hjavacallc.cbuild.gradle 背景 Demo代码 代码结构 JNI.java package com.stone.javacallc;/*** Created by stoneWang* Created on 2024/1/16* java调用C*/ public class …...
使用nginx的proxy_cache实现静态资源的缓存
nginx的版本 ./nginx -v nginx version: nginx/1.9.15需求 要求nginx缓存静态资源,如js、css、图片等,避免对静态资源的访问直接穿透到后端的j2ee应用侧,提高后端j2ee应用的运行效率。 配置方法 针对js、css、图片文件 分别增加缓存路径的…...
【Golang】Perl 正则表达式语法的支持示例
背景 在 Golang 中,标准库的正则表达式包 regexp 是基于 RE2 语法的,并不直接支持 Perl 正则表达式的全部功能。虽然 Golang 的标准库并不直接提供对 Perl 正则表达式的支持,但是您可以使用第三方库来实现与 Perl 兼容的正则表达式功能。 一…...
手写一个std::function
前言 在《std::function从实践到原理》中我们分析了std::function的实现原理,但这只是纸上谈兵。要想理解为什么这么实现,最好的办法还是想想要是自己手写一个要怎么实现。本文不想直接呈现最终版本,因为那样读者看不到某段代码是为了什么才…...
04--MySQL函数的使用
1、SQL函数的使用 当我们学习编程语言的时候,经常会遇到函数。函数的好处是,它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了编写代码的效率,又提高了可维护性。在SQL中函数主要要对数据进行处理&…...
imgaug库指南(28):从入门到精通的【图像增强】之旅(万字长文)
引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…...
精确掌控并发:漏桶算法在分布式环境下并发流量控制的设计与实现
这是《百图解码支付系统设计与实现》专栏系列文章中的第(16)篇,也是流量控制系列的第(3)篇。点击上方关注,深入了解支付系统的方方面面。 本篇重点讲清楚漏桶原理,在支付系统的应用场景&#x…...
【Redis】Redis面试热点
Redis 集群有哪些方案? 主从复制:解决了高并发问题 哨兵模式:解决了高并发,高可用问题 分片集群:解决了海量数据存储,高并发写的问题 主从复制 图示: 主从复制:单节点 Redis 并发…...
构建中国人自己的私人GPT-有道GPT
创作不易,请大家多鼓励支持。 在现实生活中,很多人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的私人GPT变得非常重要。 先看效果 一、…...
data = self._data_queue.get(timeout=timeout)
目录 解决方法 freeze_support 解决方法 opencv 升级 方法3 OMP_NUM_THREADS: 报错: data self._data_queue.get(timeouttimeout) 解决方法 freeze_support data self._data_queue.get(timeouttimeout)RuntimeError: DataLoader worker (pid(s)…...
推挽输出、开漏输出、上拉输入、下拉输入、浮空输入。
一、推挽输出 推挽输出的内部电路大概如上图中黄色部分,输出控制内有反相器,由一个P-MOS和一个N-MOS组合而成,同一时间只有一个管子能够进行导通。 当写入1时,经过反向器后为0,P-MOS导通,N-MOS截至…...
【Java JVM】栈帧
执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…...
【Emgu CV教程】5.4、几何变换之图像翻转
今天讲解的两个函数,可以实现以下样式的翻转。 水平翻转:将图像沿Y轴(图像最左侧垂直边缘)翻转的操作。原始图像中位于左侧的内容将移动到目标图像的右侧,原始图像中位于右侧的内容将移动到目标图像的左侧。垂直翻转:将图像沿X轴…...
2024年AMC8历年真题练一练和答案详解(10),以及全真模拟题
六分成长继续为您分享AMC8历年真题,最后两天通过高质量的真题来体会快速思考、做对题目的策略。 题目从575道在线题库(来自于往年真题)中抽取5道题,每道题目均会标记出自年份和当年度的序号,并附上详细解析。【使用六…...
echarts业务中常用属性设置记录
1.legend计算占比 //在data中定义两个字段 total:0, znum:0 //计算上面两个值 this.data.forEach(val > this.total parseInt(val.value)); for (let i 0; i < nv.length; i) {if (i ! nv.length - 1) {this.znum this.znum Number(parseFloat((nv[i].value / this.t…...
Ubuntu 22.04 安装prometheus
服务器监控和报警软件有很多,为什么我们会选择Prometheus而不是其他软件呢? 因为它有以下优点: 自带简易web监控页面,用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警;具有丰…...
Django的模板语言
文章目录 模板语法变量标签过滤器注释 组件引擎模板上下文加载器上下文处理器 模板引擎的支持配置用法引擎内置后端 模板 作为一个网络框架,Django 需要一种方便的方式来动态生成 HTML。最常见的方法是依靠模板。一个模板包含了所需 HTML 输出的静态部分࿰…...
为什么安卓逆向手机要root
安卓逆向工程是指对安卓应用程序进行研究和分析,以了解其内部工作原理、提取资源、修改应用行为、发现漏洞等。在某些情况下,为了进行逆向分析,需要对手机进行Root。 以下是一些安卓逆向中可能需要Root的原因: 获得完全访问权限…...
整合junit与热部署
整合junit <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.7.0</version></dependency> 测试类上添加SpringBootTest 如: 注意测试类的…...
C++面试宝典第21题:字符串解码
题目 给定一个经过编码的字符串,返回其解码后的字符串。具体的编码规则为:k[encoded_string],表示方括号内部的encoded_string正好重复k次。注意:k保证为正整数;encoded_string只包含大小写字母,不包含空格和数字;方括号确定是匹配的,且可以嵌套。 示例: 编码字符串为…...
导出浏览器网络日志 har 后缀的日志是什么 怎么打开
导出浏览器网络日志 har 后缀的日志是什么 怎么打开 一、实机演示二、har 后缀的日志是什么 .har 后缀的日志文件是一种专门用于记录和分析网页网络活动的文件格式。 📄 HAR 文件是什么? HAR 的全称是 HTTP ARchive。它本质上是一个标准的 JSON 文件&…...
Qwen-Turbo-BF16数据库课程设计:智能问答系统开发
Qwen-Turbo-BF16数据库课程设计:智能问答系统开发 想象一下,你正在上一门数据库课程。老师布置了一个课程设计:开发一个学生信息管理系统。你需要设计表结构,写SQL查询,还要做个简单的界面。你埋头苦干,终…...
告别旋转锚点!用Oriented R-CNN在DOTA数据集上轻松实现高精度遥感目标检测(附开源代码)
突破传统限制:Oriented R-CNN在遥感目标检测中的实战指南 遥感图像中的目标检测一直是计算机视觉领域的难点之一。不同于常规图像中的物体,遥感目标往往以任意角度出现,传统水平边界框检测方法难以准确捕捉其空间位置。想象一下,…...
深入理解fibjs Fiber机制:为什么它能提升并发性能
深入理解fibjs Fiber机制:为什么它能提升并发性能 【免费下载链接】fibjs JavaScript on Fiber (built on Chromes V8 JavaScript engine) 项目地址: https://gitcode.com/gh_mirrors/fi/fibjs 在JavaScript的世界中,处理高并发一直是开发者面临的…...
SeqGPT-560M智能客服问答系统部署指南
SeqGPT-560M智能客服问答系统部署指南 1. 引言 想象一下这样的场景:你的电商平台每天收到上千条客户咨询,从"这个衣服有货吗"到"怎么申请退货",问题五花八门。传统客服需要一个个手动回复,效率低下还容易出…...
舰艇推进电机供电流程优化方案
舰艇推进电机供电流程优化方案 第一章 绪论 1.1 背景与意义 现代舰艇(如驱逐舰、潜艇、全电推进船舶)广泛采用综合电力系统。传统的供电流程中,推进电机作为最大的非线性负载,其负载突变(如急加速、倒车、波浪冲击导致的螺旋桨甩尾)会通过直流母线回馈至发电机组,导致…...
Leaflet图层顺序实战:如何用setZIndex和bringToFront让你的地图层级不再混乱
Leaflet图层顺序实战:如何用setZIndex和bringToFront让你的地图层级不再混乱 当地图上同时存在多个图层时,你是否遇到过标注被底图遮盖、动态添加的标记消失在多边形下方,或是图层叠加顺序完全失控的情况?这些看似简单的层级问题&…...
springboot+vue基于web的蛋糕商城论坛交流系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析核心功能模块特色功能实现技术难点解决方案性能优化措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 …...
IndexTTS 2.0优化指南:如何选择参考音频,获得最佳克隆效果
IndexTTS 2.0优化指南:如何选择参考音频,获得最佳克隆效果 1. 引言:为什么参考音频如此重要? 在语音合成领域,参考音频就像是一把钥匙,决定了最终生成声音的质量和相似度。IndexTTS 2.0作为一款零样本音色…...
主体代码分析
一、整体架构分析这个程序是一个图片管理工具,采用MVC模式的变体,分为:UI层:界面定义(ui_image_manager.py,由Qt Designer生成)逻辑层:当前文件的业务逻辑业务层:busines…...
