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'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/409895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】【记忆化搜索】【C++算法】664. 奇怪的打印机

作者推荐 【矩阵快速幂】封装类及测试用例及样例 本文涉及知识点 动态规划 记忆化搜索 字符串 LeetCode:664 奇怪的打印机 有台奇怪的打印机有以下两个特殊要求&#xff1a; 打印机每次只能打印由 同一个字符 组成的序列。 每次可以在从起始到结束的任意位置打印新字符&am…

MacBook安装Storm与启动

MacBook安装Storm与启动 官方下载地址: https://storm.apache.org/downloads.html 官方下载 apache-storm-1.2.2.tar.gz MacBook Linux安装zookeeper 解压 tar -zxvf apache-storm-1.2.2.tar.gz先启动zookeeper cd zookeeper-3.4.12 ./bin/zkServer.sh start #查看状态 ./…

CentOS将磁盘剩余空间分配到已有分区

CentOS将磁盘剩余空间分配到已有分区 引growpartresize2fs 引 手里有台云服务&#xff0c;之前磁盘只有60G&#xff0c;在执行SQL语句时报错No space left on device. 通过df -h查看磁盘占用情况&#xff0c;确实所剩无几了 通过云服务后端控制台升级了下配置&#xff0c;将…

基于ArcGIS的晕线制作

在借助ArcGIS进行制图时&#xff0c;我们有时需要为矢量边界添加晕线&#xff0c;今天就来探索一下基于ArcGIS的晕线制作操作。 软件版本&#xff1a;ArcMap10.4.1 方法一&#xff1a;制作多环缓冲区 工具路径&#xff1a;Analysis Tools-Proximity-Mutiple Ring Buffer 思…

Vue3的使用

一 Vue3的变化 1.性能的提升 打包大小减少41% 初次渲染快55%, 更新渲染快133% 内存减少54% 2.源码的升级 使用Proxy代替defineProperty实现响应式 重写虚拟DOM的实现和Tree-Shaking 3.拥抱TypeScript Vue3可以更好的支持TypeScript 4.新的特性 Composition API&#…

入门指南:使用STM32微控制器进行ADC数据采集

使用STM32微控制器进行ADC&#xff08;模数转换器&#xff09;数据采集是嵌入式系统开发中常见的任务。本文将介绍如何通过STM32CubeMX和HAL库函数进行ADC数据采集&#xff0c;并提供相应的代码示例。 1. STM32CubeMX配置 首先&#xff0c;使用STM32CubeMX工具配置STM32微控制…

Vue3响应式系统(二)

Vue3响应式系统(一)https://blog.csdn.net/qq_55806761/article/details/135587077 六、嵌套的effect与effect栈。 什么场景会用到effect嵌套呢&#xff1f;听我娓娓道来。 就用Vue.js来说吧&#xff0c;Vue.js的渲染函数就是在effect中执行的&#xff1a; /*Foo组件*/ const…

使用mamba替换conda和anaconda配置环境安装软件

使用mamba替换miniconda和anaconda&#xff0c;原因是速度更快&#xff0c;无论是创建新环境还是激活环境 conda、mamba、anaconda都是蟒蛇的意思… 下载mambaforge wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh ba…

使用WAF防御网络上的隐蔽威胁之SSRF攻击

服务器端请求伪造&#xff08;SSRF&#xff09;攻击是一种常见的网络安全威胁&#xff0c;它允许攻击者诱使服务器执行恶意请求。与跨站请求伪造&#xff08;CSRF&#xff09;相比&#xff0c;SSRF攻击针对的是服务器而不是用户。了解SSRF攻击的工作原理、如何防御它&#xff0…

MongoDB-数据库文档操作(2)

任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握&#xff1a; 查询文档命令&#xff1b;删除文档命令。 查询文档 我们先插入文档到集合 stu1 &#xff1a; document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…

Ovtio不同版本下载

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩&#xff01; 主要专栏内容包括&#xff1a; †《LAMMPS小技巧》&#xff1a; ‾ \textbf…

Angular系列教程之观察者模式和RxJS

文章目录 引言RxJS简介RxJS中的设计模式观察者模式迭代器模式 示例代码RxJS 在 Angular 中的应用总结 引言 在Angular开发中&#xff0c;我们经常需要处理异步操作&#xff0c;例如从后端获取数据或与用户的交互。为了更好地管理这些异步操作&#xff0c;Angular中引入了RxJS&…