Android JNI实现简单的c层调用Java层函数(C层调用Java层Toast进行提示)

简介: 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~以前做过一段时间的JNI开发但是总是容易忘记一些简单的jni操作,最近重拾走过的jni开发之路,这里记录下如何在c层调用Java层类及方法,这里的类和方法可以是SDK里面的,也可以是自己编写的。

终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~

以前做过一段时间的JNI开发但是总是容易忘记一些简单的jni操作,最近重拾走过的jni开发之路,这里记录下如何在c层调用Java层类及方法,这里的类和方法可以是SDK里面的,也可以是自己编写的。这里分别给出测试工程,工程地址在文章末尾给出。JNI开发的环境配置及简单的JNI介绍百度一下资料很多。

首先编写MyTest.java类

import android.content.Context;
import android.widget.Toast;

/**
 * Created by hty on 2016/8/5.
 */
public class MyTest {

    static {
        System.loadLibrary("mytest");
    }

    private Context mContext;

    public MyTest(Context mContext){
        this.mContext = mContext;
    }
    public void show(String msg){
        Toast.makeText(mContext,msg,Toast.LENGTH_SHORT).show();
    }

    //调用自定义类的方法
    public native void callShow(String msg);
    //调用SDK里面的方法
    public native void callToastShow(Context context,String msg);
}
然后利用javah生成对应的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
/* Header for class com_scu_jnidemo_MyTest */
#define TAG "mytest"
#define LOGE(...) __android_log_print(__ANDROID_LOG_ERROR,TAG,__VA_ARGS_)/*这里是LOGE日志*/

#ifndef _Included_com_scu_jnidemo_MyTest
#define _Included_com_scu_jnidemo_MyTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_scu_jnidemo_MyTest
 * Method:    callShow
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callShow
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_scu_jnidemo_MyTest
 * Method:    callToastShow
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callToastShow
  (JNIEnv *, jobject,jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif
最后编写对应的.cpp文件

//
// Created by hty on 2016/8/5.
//
#include "com_scu_jnidemo_MyTest.h"

/*
 * Class:     com_scu_jnidemo_MyTest
 * Method:    callShow
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callShow
  (JNIEnv *env, jobject thiz, jstring str){
    jclass myclass = env->FindClass("com/scu/jnidemo/MyTest");
    jmethodID mid = env->GetMethodID(myclass,"show","(Ljava/lang/String;)V");
    env->CallVoidMethod(thiz,mid,str);
  }

/*
 * Class:     com_scu_jnidemo_MyTest
 * Method:    callToastShow
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callToastShow
  (JNIEnv *env, jobject thiz,jobject context, jstring str){
     jclass tclss = env->FindClass("android/widget/Toast");
     jmethodID mid = env->GetStaticMethodID(tclss,"makeText","(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;");
     jobject job = env->CallStaticObjectMethod(tclss,mid,context,str);
     jmethodID showId = env->GetMethodID(tclss,"show","()V");
     env->CallVoidMethod(job,showId,context,str);
  }
最后在主程序里面进行测试:

package com.scu.jnidemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener{

    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView)findViewById(R.id.text);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        MyTest myTest = new MyTest(this);
        switch (view.getId()){
            case R.id.button1:
                myTest.callShow("这个是调用MyTest类里面的show");
                break;
            case R.id.button2:
                myTest.callToastShow(this,"这个是JNI直接调用Toast");
                break;
        }
    }
}
在程序里面需要注意的是在local.propreties里面需要将对应的sdk.dir和ndk.dir改成自己的路径

这里给出工程源码地址:JNI实现C层调用Java层函数

目录
相关文章
|
18天前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
12月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
95 1
|
12月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
119 3
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
93 1
java基础(11)函数重载以及函数递归求和
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
250 11
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
463 11
|
存储 运维 Java
函数计算产品使用问题之怎么配置定时触发器来调用Java函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
928 1

热门文章

最新文章

  • 1
    Android实战经验之Kotlin中快速实现MVI架构
    344
  • 2
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    211
  • 3
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    553
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    854
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    313
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    230
  • 7
    Android历史版本与APK文件结构
    739
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    245
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    262
  • 10
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    491