android NDK--C 调用java

Easepal_NDK_C调用Java并刷新UI(自己用的) Easepal_NDK_C调用Java并刷新UI Easepal_NDK_C调用Java并刷新UI Easepal_NDK_C调用Java并刷新UIEasepal_NDK_C调用Java并刷新UI 立即下载

在java 端定义三个方法供C语言调用,当点击三个方法对应的button的时候,C代码会调用相应的java 方法。

创建工程,同时在该包下创建一个用于存放C代码调用方法的类DataProvider,DataProvider的代码如下:

package com.example.calljava;

public class DataProvider {
    static{
        System.loadLibrary("CAllJava");
    }
    public native void callPrintString();
    public native int callAdd();
    public native void callFromJava();

    //c 调用java空方法
    public void printString(String s){
        System.out.println("java"+s);
    }

    public int add(int x,int y){
        System.out.println("java"+(x+y));
        return x+y;
    }

    public void fromJava(){
        System.out.println("hello from java");
    }

}

使用javah 工具生成本地方法的方法签名 .h头文件

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

#ifndef _Included_com_example_calljava_DataProvider
#define _Included_com_example_calljava_DataProvider
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_calljava_DataProvider
 * Method:    callPrintString
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_calljava_DataProvider_callPrintString
  (JNIEnv *, jobject);

/*
 * Class:     com_example_calljava_DataProvider
 * Method:    callAdd
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_calljava_DataProvider_callAdd
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     com_example_calljava_DataProvider
 * Method:    callFromJava
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_calljava_DataProvider_callFromJava
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

在jni目录下,根据头文件实现C代码

#include<stdio.h>
#include<stdlib.h>
#include <jni.h>
#include "com_example_calljava_DataProvider.h"
#include<android/log.h>
#include<malloc.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)



JNIEXPORT void JNICALL Java_com_example_calljava_DataProvider_callFromJava
  (JNIEnv *env, jobject obj){
    //接收到要调用的java端方法所在的全名
    char* classname="com/example/calljava/DataProvider";
    //通过包名寻找java中的class
    jclass clas;
    clas=(*env)->FindClass(env,classname);
    if(clas==0){
        LOGI("cann't find clas");
    }else{
        LOGI("find cals");
    }

    //通过方法签名找到对应的方法
    jmethodID jmethod=(*env)->GetMethodID(env,clas,"fromJava","()V");
    if(jmethod==0){
        LOGI("cann't find jmethod");
    }else{
        LOGI("find jmethod");
    }
    //调用虚拟机中的方法
    (*env)->CallVoidMethod(env,obj,jmethod);
}


JNIEXPORT void JNICALL Java_com_example_calljava_DataProvider_callPrintString
  (JNIEnv *env, jobject obj){
    char* classname="com/example/calljava/DataProvider";
    jclass clas;
    clas=(*env)->FindClass(env,classname);
    if(clas==0){
        LOGI("clas cann't find");
    }else{
        LOGI(" find clas");
    }

    jmethodID jmethod=(*env)->GetMethodID(env,clas,"printString","(Ljava/lang/String;)V");
    if(jmethod==0){
        LOGI("cann't find jmethod");
    }else{
        LOGI("find jmethod");
    }
    (*env)->CallVoidMethod(env,obj,jmethod,(*env)->NewStringUTF(env,"haha from c"));
}

JNIEXPORT jint JNICALL Java_com_example_calljava_DataProvider_callAdd
  (JNIEnv *env, jobject obj, jint x, jint y){
    char* classname="com/example/calljava/DataProvider";
    jclass clas;
    clas=(*env)->FindClass(env,classname);
    if(clas==0){
        LOGI("cann't find clas");
    }else{
        LOGI("find clas");
    }

    jmethodID jmethod=(*env)->GetMethodID(env,clas,"add","(II)I");
     if(jmethod==0){
         LOGI("cann't find jmethod");
     }else{
         LOGI("find jmethod");
     }

     jint result=(*env)->CallIntMethod(env,obj,jmethod,2,4);
     LOGI("c code=%d",result);
}

NDK 编译生成动态库

java代码load动态库,调用native 方法
MainActivity 中调用native 方法

package com.example.calljava;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void click(View view){
        DataProvider provider=new DataProvider();
        provider.callFromJava();
    }

    public void click2(View view){
        DataProvider provider=new DataProvider();
        provider.callAdd();
    }

    public void click3(View view){
        DataProvider provider=new DataProvider();
        provider.callPrintString();
    }
}

Android之c调用java方法 一个Android JNI开发的例子。这里是一个在c方法中调用JAVA方法的例子。代码中有详细的解释。有需要的可以免费下载学习。 立即下载

相关推荐

NDKC调用Java函数传参或获取变量

NDK开发时,C/C++调用Java的函数的一些案例; 传递int类型参数: https://blog.youkuaiyun.com/niuba123456/article/details/80978500 传递String类型参数: https://blog.youkuaiyun.com/niuba123456/article/details/80978916 传递多个参数: https://blog.youkuaiyun.com/niuba123456/article/details/80979082 调用静态函数: https://blog.youkuaiyun.com/niuba123456/article/details/80979019 C/C++获取Java的全局变量: 获取int类型和String类型变量并重新赋值: https://blog.youkuaiyun.com/niuba123456/article/details/80990063 获取静态变量: https://blog.youkuaiyun.com/niuba123456/article/details/80990237

NDK 之 C调用Java

本来打算自己总结一下 C调 java ,下边这篇文章不错,直接转过来了O(∩_∩)O~  本文转自 : http://blog.youkuaiyun.com/zhaowb82/article/details/7269903 1、 新建一个测试类TestProvider.java 该类提供了2个方法 一个静态的方法,一个非静态的方法 2、JNI中新建Provider.c 该文件中需要

liuyan20092009的专栏 518

ndk开发,在c中调用java中的代码

ndk开发,在c中调用java中的代码

NDK笔记--C++调用java

这一节主要了解从C/C++调用java的过程,一般是用在Android与Native交互的场景中...

ljt2724960661的博客 488

WSL2网络配置全攻略:如何让Windows和Linux子系统互相访问端口(附防火墙设置)

本文深入解析WSL2的网络架构,并提供详细的端口互通配置指南。针对WSL2与Windows宿主机之间常见的网络访问问题,文章从原理出发,逐步讲解如何识别网络环境、配置Windows防火墙规则、调整服务监听地址,并介绍镜像网络模式等进阶优化方案,最终实现稳定可靠的双向端口访问。

sony5的博客 1148

CRMEB商城系统任意文件下载漏洞(CVE-2024-52726)分析与修复

在Web应用安全领域,API接口安全是保障系统边界安全的核心环节。其原理在于通过签名验证、参数校验等机制,确保请求的合法性与完整性。这项技术的价值在于为系统间数据交互提供安全通道,防止未授权访问和数据泄露。典型的应用场景包括电商系统的对外数据接口、第三方服务集成等。然而,当签名验证逻辑存在缺陷或文件路径处理不当,便会引发严重的安全风险。本文以CRMEB开源商城系统为例,深入剖析其对外API模块中因签名验证绕过和路径遍历导致的任意文件下载漏洞。该漏洞允许攻击者下载服务器敏感文件,如数据库配置文件、日志和源码,

weixin_27722377的博客 376

安卓JNI/NDK开发3(进阶 在C代码中调用java方法)

在C代码中调用java方法的步骤:C代码中调用java的方法,非常类似于java中的反射调用一:获得字节码// jclass (*FindClass)(JNIEnv*, const char*); jclass clazz = (*env)->FindClass(env,"zz/itcast/pay/MainActivity"); * FindClass 方法中第二个参数是类的全名,但是

qq_35287382的博客 503

【Qt-4】QT基于qhttp-server搭建http服务器

QT搭建http服务器

WXG1011的博客 5712

android ndk c++ 调用 java

基于 Android NDK 的学习之旅----- C调用Java(附源码) 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现。 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法。   1、主要流程 1、 新建一

yangzm的专栏 616

视频帧插学习(三):ema-vfi代码拆解和分析

video interp EMA-VFI

mikhailbran的博客 708

vue支付项目-APP支付宝支付功能

如果用户已安装支付宝客户端,商家 App 唤起支付宝完成支付,支付完后跳回到商家 App 内,最后展示支付结果。如果用户没有安装支付宝客户端,商家 App 内会调起支付宝网页支付收银台,用户登录支付宝账号,支付完后展示支付结果。1.点击按钮开通或者续费,会验证是否选择会员商品以及对协议是否查看选中(这里根据项目需要自行验证,可忽略),验证通过打开选择支付方式弹窗页面,选择微信支付或者支付宝支付;4.可取消支付,放弃支付会返回会员页面,页面提示支付取消;1.判断支付方式,如果是2,则是支付宝支付方式。

总结前端开发中遇到的问题,分享前端知识 1万+

ndk开发中,在c中调用java代码

在ndk开发中,在c中调用java代码其实是通过反射技术来实现的。 代码的下载链接为:http://download.youkuaiyun.com/detail/caihongshijie6/6649995 1、main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi

黄俊东的专栏 2800

1.07---共识机制详解(PoW、PoS、DPoS 对比)

【摘要】区块链能成为“无需信任的协作网络”,靠的正是它的“共识机制”。本节将深入剖析 PoW、PoS、DPoS 等核心共识模型,并结合以太坊从 PoW 到 PoS 的转型与 Solana 等新型方案,为你拆解这一决定区块链运行方式、性能、安全性的“发动机系统”。什么是共识机制?为何不是多数投票这么简单?三大主流共识算法(PoW、PoS、DPoS)机制对比与演化路线以太坊从 PoW 到 PoS 的转型细节(The Merge)Solana 的 PoH + PoS 混合共识机制解析。

鄙人kunzhi96,感恩遇见! 1万+

安卓 c调用java_Android NDK开发之C调用Java及原生代码断点调试(二)

上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了。点击:Android NDK开发之从Java与C互调中详解JNI使用(一)本篇我们主要学习如何从C源码中调用Java代码,以及使用gradle-experimental来调试原生代码。C 调用 Java 成员变量首先我们现在Java2CJNI类中...

weixin_34509784的博客 246

EM的理论与实践(基础篇)

EM理论与实践

m0_61544122的博客 2380

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法之旅!

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1306

java 调用c ndk_Android JNI 和 NDK

JNI (Java Native Interface) 和 NDK (Native Development Kit):jni 是java调用native interface的功能,ndk 是android提供的底层开发包 。jni 的目的是java调用c、c++写的本地方法;android下是用JNI时需要的.so文件,是通过ndk-build生成的。Java Native Interface(J...

weixin_32421297的博客 423

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

转战Android之NDK(jni, java调用c/c++)

java调用c/c++过程 1. 已采用ndk编译出c/c++库(c_libname.a/ c_libname so),根据c_libname.h编写对应的java类; 2. 根据native java类,编译出对应的cpp文件头;如下面例子:     a) 使用Java工具Javah可以很容易地创建它而不用手动去创建。你对Java的class文件使用javah命令,就会为你生成一个对应的C

hqulyc的专栏 4159

数学建模模型总结

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android ndk c代码调用java的代码

这里简单说一下ndk中c调用java的方法 至于ndk的环境搭建这里就不说了,有空会贴上来 java调c的感觉相对比较简单,以后有空一并贴上来,这里说下 c去回调java的代码了 首先创建工程就不说了,我们这里展开一个经典例子  helloworld  哈哈哈 第一步,在android工程中 建一个类,里面放个方法,syso一个helloworld。同时建议建立一个

桃花源 6546

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C

首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解!关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只要配置好能编译JNI的本地示例程序就可以了。(NDK-1.6版本)一、这里讲一下如何自己写JNI程序,网上很多都是讲用javah自动生成,其实并没有太多必要。首先进入android-ndk-1.6_r1...

weixin_39779537的博客 141

ndk c调用java_Android NDK学习之cc++调用Java本地实例方法(二)

Android NDK学习之c/c++调用Java本地实例方法,调用本地静态方法下一节!1,新建工程NdKActivitySample2,编写NdKActivitySample2.javapublic class NdKActivitySample2 extends Activity {/** Called when the activity is first created. */@Overri...

weixin_39824191的博客 154

Android Ndk中C与JAVA之间的互相调用

本例实现一个简单的场景: 1、使用C编写一个方法,接收1个参数,方法中调用Java的方法。 2、Java类中编写一个方法,接收一个参数。 3、模拟调用场景:点击按钮 -> 调用C方法-> C调用Java方法-> 获得返回值-> Toast提示。 项目结构图: 代码如下: CcallJava.java package...

weixin_33979363的博客 203

Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程

转自:http://blog.sina.com.cn/s/blog_5d75da2d0100ogvg.html 首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解!   关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只要配置好能编译JNI的本地示例程序就可以了。

Skypine_Lee的专栏 390

c调用java static_Android NDK 学习之在C中调用Java的变量和静态变量

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

weixin_42519514的博客 121

Android Studio下使用NDK的流程

我要重新拿回持之以恒徽章!! 老规矩,先说看能学会什么:ANDROID STUDIO下NDK的使用方法。JNI的基本使用方法,C语言调用JAVA的方法。 首先要下载NDK,如果你没有VPN可以来http://www.androiddevtools.cn/进行下载。下载后解压到任意目录。 其次,新建一个安卓项目。在MainActivity里添加一个Native方法。 public

旋转 跳跃 然后 团灭 1523
上一篇: android NDK --java 与 C 语言之间传递数据
下一篇: java 垃圾回收
技术搬运工
博客等级 码龄11年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值