Android JNI ,将java 实例与c实例绑定

测试条件:

c++ 中存在class TestA,其中含有属性int a。

java 中存在class TestJni,

TestJni.java代码如下:

 1 public class TestJni {
 2 
 3     public native final void setA(int a);
 4     public native final void add(int add);
 5     public native final int getA();
 6     private int mNativeInJavaObj;
 7     
 8     static {
 9         System.loadLibrary("testjni");
10     }
11 }
TestJni中属性mNativeInJavaObj用来绑定c++中TestA的对象实例,有点像一个ID。


com_zcw_soundtouch_TestJni.cpp代码如下:
 1 /* DO NOT EDIT THIS FILE - it is machine generated */
 2 #include <jni.h>
 3 #include <android/log.h>
 4 
 5 #include "testclassa.h"
 6 /* Header for class com_zcw_soundtouch_TestJni */
 7 
 8 #define LOGV(...)   __android_log_print((int)ANDROID_LOG_INFO, "SOUNDTOUCH", __VA_ARGS__)
 9 //#define LOGV(...)
10 
11 // ----------------------------------------------------------------------------
12 
13 struct fields_t {
14     jclass    testAClass;
15     jfieldID    context;
16 };
17 static fields_t fields;
18 
19 //static Mutex sLock;
20 
21 // ----------------------------------------------------------------------------
22 
23 
24 #ifndef _Included_com_zcw_soundtouch_TestJni
25 #define _Included_com_zcw_soundtouch_TestJni
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 void persistence(JNIEnv * env, jobject thiz){
30     LOGV("called persistence");
31     /*
32     fields.testAClass = env->FindClass("");
33     fields.context = 
34         env->GetFieldID(fields.testAClass,
35                         "mNativeInJavaObj", "I");
36     */
37     if(NULL==fields.context){
38         fields.testAClass = env->GetObjectClass(thiz);
39         fields.context = 
40         env->GetFieldID(fields.testAClass,
41                         "mNativeInJavaObj", "I");
42         
43     }
44     int value = env->GetIntField(thiz, fields.context);
45     if(0!=value){
46         LOGV("class TestA is eixts");
47         return ;
48     }
49     LOGV("class TestA is not eixts");
50     TestA * testA = new TestA();
51     testA->setA(10);
52     env->SetIntField(thiz,fields.context, (int)testA);
53 }
54 /*
55  * Class:     com_zcw_soundtouch_TestJni
56  * Method:    setA
57  * Signature: (I)V
58  */
59 JNIEXPORT void JNICALL Java_com_zcw_soundtouch_TestJni_setA
60   (JNIEnv *env, jobject thiz, jint value)
61 {
62     persistence(env,thiz);
63     TestA* testA = (TestA*)env->GetIntField(thiz, fields.context);
64     testA->setA((int)value);
65 }
66 
67 /*
68  * Class:     com_zcw_soundtouch_TestJni
69  * Method:    add
70  * Signature: (I)V
71  */
72 JNIEXPORT void JNICALL Java_com_zcw_soundtouch_TestJni_add
73   (JNIEnv *env, jobject thiz, jint value)
74 {
75     persistence(env,thiz);
76     TestA* testA = (TestA*)env->GetIntField(thiz, fields.context);
77     testA->addA((int)value);
78     
79 }
80 
81 /*
82  * Class:     com_zcw_soundtouch_TestJni
83  * Method:    getA
84  * Signature: ()I
85  */
86 JNIEXPORT jint JNICALL Java_com_zcw_soundtouch_TestJni_getA
87   (JNIEnv *env, jobject thiz )
88 {
89     persistence(env,thiz);
90     TestA* testA = (TestA*)env->GetIntField(thiz, fields.context);
91     
92     return testA->getA();
93 }
94 
95 #ifdef __cplusplus
96 }
97 #endif
98 #endif

testclassa.h

 1 #include<stdio.h>
 2 
 3 
 4 class TestA{
 5 private:
 6     int a ;
 7 
 8 public:
 9     TestA();
10     ~TestA();
11     void setA(int avalue);
12     void addA(int add);
13     int getA();
14 
15 };

testclassa.cpp

 1 #include<stdio.h>
 2 #include "testclassa.h"
 3 
 4 TestA::TestA(){}
 5 TestA::~TestA(){}
 6 
 7 
 8 void TestA::setA(int avalue)
 9 {
10     a = avalue;
11 }
12 
13 void TestA::addA(int add)
14 {
15     a+=add;
16 }
17 
18 int TestA::getA()
19 {
20     return a;
21 }

java测试代码:

 1 Log.e(TAG, "start load jni");
 2         {
 3             TestJni testJni = new TestJni();
 4             Log.e(TAG, "loaded jni");
 5             testJni.setA(100);
 6             Log.e(TAG, "setted value ");
 7             testJni.add(2912);
 8             int value = testJni.getA();
 9             Log.e(TAG, "after add:a="+value);
10         }
11         Log.e(TAG, "===============");
12         {
13             TestJni testJni = new TestJni();
14             Log.e(TAG, "loaded jni");
15             testJni.setA(257);
16             Log.e(TAG, "setted value ");
17             testJni.add(212);
18             int value = testJni.getA();
19             Log.e(TAG, "after add:a="+value);
20         }

打印结果:

 1 10-21 12:52:41.057: E/Main2Activity(13677): loaded jni
 2 10-21 12:52:41.057: I/SOUNDTOUCH(13677): called persistence
 3 10-21 12:52:41.057: I/SOUNDTOUCH(13677): class TestA is not eixts
 4 10-21 12:52:41.057: E/Main2Activity(13677): setted value 
 5 10-21 12:52:41.057: I/SOUNDTOUCH(13677): called persistence
 6 10-21 12:52:41.057: I/SOUNDTOUCH(13677): class TestA is eixts
 7 10-21 12:52:41.057: I/SOUNDTOUCH(13677): called persistence
 8 10-21 12:52:41.057: I/SOUNDTOUCH(13677): class TestA is eixts
 9 10-21 12:52:41.057: E/Main2Activity(13677): after add:a=3012
10 10-21 12:52:41.057: E/Main2Activity(13677): ===============
11 10-21 12:52:41.057: E/Main2Activity(13677): loaded jni
12 10-21 12:52:41.057: I/SOUNDTOUCH(13677): called persistence
13 10-21 12:52:41.057: I/SOUNDTOUCH(13677): class TestA is not eixts
14 10-21 12:52:41.057: E/Main2Activity(13677): setted value 
15 10-21 12:52:41.057: I/SOUNDTOUCH(13677): called persistence
16 10-21 12:52:41.057: I/SOUNDTOUCH(13677): class TestA is eixts
17 10-21 12:52:41.057: I/SOUNDTOUCH(13677): called persistence
18 10-21 12:52:41.057: I/SOUNDTOUCH(13677): class TestA is eixts
19 10-21 12:52:41.057: E/Main2Activity(13677): after add:a=469

 

转载于:https://www.cnblogs.com/zhouchanwen/p/3380393.html

android framework层怎么调用jni层接口 在Android Framework层调用JNI层接口的流程如下:在Java类中声明Native方法。生成JNI头文件。在C/C++中实现Native方法。编译Native代码为共享库。在Java代码中加载Native库。调用Native方法。通过JNI,Android Framework层可以与底层系统(如Linux内核)进行交互,实现高性能的功能开发。 阅读详情

相关推荐

Android JNI开发记录

上面表示JNIEnv跟每个线程是捆绑的,无法在线程B访问到线程A的JNIEnv,所以通过保存g_env的方式去使用是不行的。所谓函数签名,简单点的理解可以理解成一个函数的唯一标识,一个签名对应着一个函数的签名。不过通常标准情况下生成的so库需要放在单独的jniLibs文件夹下,再配置build.gradle文件指定加载的so库地址,这样才算比较完整的jni开发流程。c、注意如果jni方法是通过static方式调用的话,这边的jobject表示的是jclass对象,需要进行强转,并不表示一个独立的对象。

sgf012112130的博客 951

Android JNI对象与Java对象的绑定

在Android 开发过程中,经常会用到JNI,要么就是Java调用JNI,要么就是JNI回调Java。一种习惯的做法是把在Java和JNI 都生成相同名字的Class,并将它们互相绑定,这样双方互相调用也非常方便。

code09的专栏 1383

android studio使用JNI

这提供了一个在Java平台上调用C/C++的一种途径,反之亦然。而且编译后生成的二进制代码只能在本地操作系统环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。与其它类似接口Microsoft的原始本地接口等相比,JNI的主要竞争优势在于:它在设计之初就确保了二进制的兼容性,JNI编写的应用程序兼容性以及其再某些具体平台上的Java虚拟机兼容性(当谈及JNI时,这里并不特比针对Davik虚拟机,JNI适用于所有JVM虚拟机)。

983

JNI绑定实践

目录背景静态注册1.引入so文件和native方法2.编译生成jni头文件3.实现jni方法4.实现CMakeLists.txt动态注册1.定义对应交互的java方法2.引入c++代码和CMakeLists.txt文件3.编辑c++文件4.实现CMakeLists.txt 背景 博主之前做的日志组件的结构是java和c++相结合实现。将日志的加密,压缩,文件写入等对性能比较敏感的模块放在c++层实现,而将日志的格式化,日志脱敏等功能放在java层实现。这就会涉及到java和c++的交互,即jni。 jni注

我是黄大仙 820

Android模块里面增加JNI的方法,调用c代码

通过Java调用C语言的移位方法,设置文件的某一位的二进制位0或者1

ATM火控电容改造实战:提升速凌无刷电机动力与系统稳定性

在嵌入式系统与电机驱动领域,电源完整性是保障电路稳定运行的核心基础。其核心原理在于通过合理的电容网络设计,为负载提供瞬时大电流并滤除高频噪声,从而维持电压稳定。这项技术的核心价值在于能显著提升系统的动态响应能力与可靠性,避免因电压跌落导致微控制器复位或功率器件过应力。典型的应用场景包括无人机电调、机器人关节驱动以及各类需要快速响应的伺服系统。本文聚焦于水弹发射器ATM火控系统的硬件迭代,通过详解电容的选型、布局与焊接流程,特别是针对速凌五代无刷电机的高启动电流特性,系统性地阐述了如何通过强化电源储能与芯片去

weixin_33868027的博客 554

JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

本文原创,转载请注明出处:http://blog.youkuaiyun.com/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链接库(windos下就是.dll库,Linux就是.so库了,不懂在Window下生...

tansitongba 639

潜流式人工湿地计算_复合人工湿地净化水产养殖污水技术

技术概论1. 定义与分类人工湿地是指用人工筑成水池或沟槽,底面铺设防渗漏隔水层,充填一定深度的基质层,种植水生植物,利用基质、植物、微生物的物理、化学、生物三重协同作用使污水得到净化的系统。当池塘养殖污水进入人工湿地时,其污染物被床体吸附、过滤、分解而达到水质净化作用。按照水体流动方式,人工湿地分为表面流人工湿地、水平潜流人工湿地、垂直潜流人工湿地以及由前面几种湿地混合搭配的组合式人工湿...

weixin_42365490的博客 4244

Linux下JNI的使用--jni创建Java对象

一、环境准备Windows7 + WMwareWorkstation9 + RedHatEnterprise5 + jdk1.7.0_51我的jdk安装路径为 /usr/java/jdk1.7.0_51二、步骤1.编写Java代码 Hello.javapackageorg.bt.hello; publicclassHello{ priva...

weixin_33947521的博客 279

Qt之QSqlTableModel:高效数据库操作与视图绑定的实战指南

本文深入探讨了Qt框架中的QSqlTableModel组件,它作为连接数据库与Qt视图的智能中介,能极大简化数据库的增删改查操作。通过实战代码演示,详细讲解了如何快速构建可编辑的数据表格、理解并设置关键的数据编辑策略(如OnManualSubmit),以及实现数据过滤、排序等高级功能。文章还提供了性能优化、事务处理及常见避坑指南,帮助开发者高效、稳健地开发数据库驱动的桌面应用。

y4z5a6b7的博客 440

qt实现OCC读取STEP模型并显示(附完整源码)

qt实现OCC读取STEP模型并显示(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1480

Android Studio NDK 学习之接受Java传入的Int数组

本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK。 用Android Studio新建一个工程叫AndroidJNI_IntArray,其目录结构如下: ├── AndroidJNI_IntArray.iml ├── app │   ├── app.iml │   ├── buil

雪夜&流星的专栏 1112

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1181

Android NDK 学习之传递类对象

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

weixin_34122810的博客 181

Unity 编辑器篇|(一)MenuItem菜单栏

"一级菜单/二级菜单上/三级菜单""一级菜单/二级菜单中 %#_B""一级菜单/二级菜单下 %&_C""一级菜单/二级菜单中 %#_B""一级菜单/二级菜单下 %&_C""GameObject/二级菜单""CONTEXT/组件名/菜单名""一级菜单/二级菜单上 #_A""Assets/二级菜单""一级菜单/二级菜单下""一级菜单/二级菜单上""一级菜单/二级菜单中""一级菜单/二级菜单下""一级菜单/二级菜单下""一级菜单/二级菜单上""一级菜单/二级菜单中""一级菜单/二级菜单下""自定义/Test"

游戏开发小Y的博客 13万+

手机银行应用架构设计

网上银行借助互联网、移动通信网络等技术向客户提供金融服务,易受到通讯层面的安全威胁,金融机构应从通讯协议、安全认证、通信链路安全等层面,采取措施有效应对相关风险。网上银行系统服务器端提供网上银行应用服务和核心业务处理功能,金融机构应充分利用物理环境、通信网络、计算环境等领域的防护技术,在攻击者和受保护的资源间建立多道严密的安全防线。 网上银行除直接向用户提供金融服务外,也可能与外部机构开展业务合作。在网上银行系统设计、开发、部署和运营过程中,应充分考虑外部机构的系统可能存在的安全风险,并针对各类风险进行有效

银行信息系统应用架构详解 4828

Android Runtime JNI函数查找与绑定过程原理剖析(69)

JNI(Java Native Interface)作为Java与本地代码(如C/C++)交互的桥梁,在Android Runtime(ART)中承担着关键作用。通过JNI,Java代码能够调用本地代码实现的功能,本地代码也可以回调Java方法,极大地拓展了Android应用的能力边界,例如实现高性能的音视频处理、访问底层硬件资源等。

Android开发领域创作者 901

SPICE仿真软件:Ngspice_(2).安装与配置

在Netlist文件中直接定义模型。V1 1 0 5R1 2 0 1k* Analysis库文件中可以包含多种电路元件模型和参数。

kkchenjj的博客 1585

Android JNI

JNI(Java Native Interface)是Java提供的技术,支持Java与其他语言(如C/C++)交互编程。在Android中使用JNI需要配置CMake和NDK,步骤如下:1) 在build.gradle中添加NDK架构和CMake配置;2) 创建cpp文件夹存放本地代码;3) 编写CMakeLists.txt文件配置编译规则。示例展示了如何配置JNI环境并成功编译,为后续开发跨语言交互功能奠定基础。JNI常用于调用旧库、硬件交互或性能优化场景,但会牺牲部分平台可移植性。

yfuxzpskbr的博客 1154

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android之 JNI详解

Android JNI详解

qq_29848853的博客 6442

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android JNI(一)——NDK与JNI基础

Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNI。JNI就是Java调用C++的规范。当然,一般的Java程序使用的JNI标准可能和android不一样,Android的JNI更简单。

hirezy 3306

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Android JNI - 4】在 C 中回调 Java 代码示例

在 C 中回调 Java 代码示例一、 Java 方法实现1、实现 JNI_C_Call_Java.java 代码2、通过javah 生成 jni 头文件3、实现JNI 头文件中 C代码函数(1) 在C中调用java 普通方法(2) 在C中调用java static 静态方法(3) 显示所有方法的签名 javap -s 包名.类名4、配置 cmake 编译 c 代码为库文件5、在 APK 中通过...

|~~~热爱生活、努力学习的小伙汁~~~| 682

android jni总结,安卓JNI总结

jvm将硬件、操作系统底层和应用层隔离开来,使得java成为了一种跨平台语音。java开发人员不需要关心硬件和操作系统的差异,jvm自动将class文件翻译成适合的机器语言。与此同时,很多优秀的库,或者操作系统如Linux,是由C/C++编写的,如果能使用java调用这些库,将会提高开发效率。jni就是java和C/C++代码之间的桥梁。通过JNI,java可以调用C/C++代码。安卓中JNI的使...

weixin_42537919的博客 425

【Android】深入浅出 JNI

JNI是一套标准规范,允许运行在 Java 虚拟机中的 Java/Kotlin 代码 与能够与本地代码 (Native Code,通常是 C 或 C++) 进行安全、高效的双向通信。数据类型映射规范:定义了Java类型与本地C/C++类型之间的完整映射关系,包括基本类型(如jint对应Java的int)、引用类型(如jobject对应Java对象)以及数组类型(如jintArray)。方法命名和注册规范规定了本地方法的命名规则,采用"Java_*包名_*类名_方法名"的格式。

weixin_44814196的博客 995

【Android】之【NDK】【JNI】

Android NDK&JNI 实践

Crazy程序猿 999

Android == JNI动态注册

传统的关于android使用JNI调用C/C++程序,首先javah 生产头文件,然后拷贝头文件里面的方法到C文件中进行映射调用,也就是JNI的静态注册,上一篇文章已经讲了,由于这种方法生成的映射方法名不太规则也比较长,二呢是调用数据较慢;因此可以使用JNI动态注册方法的方式来解决这个问题。 学习这个JNI动态注册的时候还是遇到了挺多的问题的,现在就讲这些问题做下记录。 准备知...

hjf161105的博客 1494
上一篇: 新的一天,开始吧,骚年
下一篇: 用正则表达式提取字符串中的字符(包含数字)
weixin_30360497
博客等级 码龄11年 239粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值