原理

原理其实很简单
首先用FindClass()查找java类,然后用GetMethodID()得到构造函数
构造函数的函数名是“< init >”,返回类型为"V"(void)
最后直接用NewObject()创建一个按钮
回调部分受到了别人文章和快写代码的启发,把回调类的地址传递到java中,java类接收到事件后用地址作为参数调用本地方法,本地方法把地址转换为c++回调类,调用方法

代码

MainActivity.java

package com.Diamond.ndk;import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.content.Context;
import android.widget.Button;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Context context = MainActivity.this;LinearLayout mainLayout = new LinearLayout(this);mainLayout.setOrientation(1);setContentView(mainLayout);onCreate(context,mainLayout);}@Overrideprotected void onDestroy() {onActivityDestroy();super.onDestroy();}public native void onActivityDestroy();public native void onCreate(Context context,LinearLayout mainLayout);static {System.loadLibrary("jni");}
}

MyOnClickListener.java

package com.Diamond.ndk;
import android.view.View;
import android.util.Log;public class MyOnClickListener implements View.OnClickListener {public int address;public MyOnClickListener(int ar) {address = ar;}@Overridepublic void onClick(View p1) {callOnClick(address);Log.d("address","" + address);}public native void callOnClick(long address);static {System.loadLibrary("jni");}
}

main.cpp

#include <sstream>
#include <jni.h>
#include <android/log.h>using namespace std;extern "C"
{class OnClickListener{public:virtual void onClick() = 0;};JNIEnv *Env = NULL;jobject button = NULL;const string linearlayout_package = "android/widget/LinearLayout";const string context_package = "android/content/Context";const string button_package = "android/widget/Button";const string view_package = "android/view/View";const string charsequence_package = "java/lang/CharSequence";const string myonclicklistener_package = "com/Diamond/ndk/MyOnClickListener";const string onclicklistener_package = "android/view/View$OnClickListener";jclass LinearLayout = NULL;jclass Context = NULL;jclass Button = NULL;jclass View = NULL;jclass MyOnClickListener = NULL;jmethodID init_button = NULL;jmethodID init_myonclicklistener = NULL;jmethodID addView_linearlayout = NULL;jmethodID setText_button = NULL;jclass getClass(string package);void setText(jobject button, string text);class MyListener : public OnClickListener{public:virtual void onClick(){//用了会崩溃,不知道为什么//setText(button, "be clicked");__android_log_print(ANDROID_LOG_INFO, "test", "test");}};MyListener *listener = NULL;JNIEXPORT void JNICALL Java_com_Diamond_ndk_MainActivity_onCreate(JNIEnv * env, jobject thiz,jobject context,jobject mainLayout){Env = env;LinearLayout = getClass(linearlayout_package);Context = getClass(context_package);Button = getClass(button_package);View = getClass(view_package);MyOnClickListener = getClass(myonclicklistener_package);setText_button =Env->GetMethodID(Button, "setText", ("(L" + charsequence_package + ";)V").data());init_button = env->GetMethodID(Button, "<init>", ("(L" + context_package + ";)V").data());button = env->NewObject(Button, init_button, context);setText(button, "JNI Button");listener = new MyListener();jmethodID setOnClickListener_button = env->GetMethodID(Button, "setOnClickListener",("(L" + onclicklistener_package +";)V").data());init_myonclicklistener = env->GetMethodID(MyOnClickListener, "<init>", "(I)V");jobject myonclicklistener =env->NewObject(MyOnClickListener, init_myonclicklistener, jint(listener));env->CallVoidMethod(button, setOnClickListener_button, myonclicklistener);addView_linearlayout =env->GetMethodID(LinearLayout, "addView", ("(L" + view_package + ";)V").data());env->CallVoidMethod(mainLayout, addView_linearlayout, button);}JNIEXPORT void JNICALL Java_com_Diamond_ndk_MainActivity_onActivityDestroy(JNIEnv * env,jobject thiz){delete listener;}JNIEXPORT void JNICALL Java_com_Diamond_ndk_MyOnClickListener_callOnClick(JNIEnv * env,jobject thiz,jint address){OnClickListener *listener = (OnClickListener *) address;listener->onClick();}jclass getClass(string package){return Env->FindClass(package.data());}void setText(jobject button, string text){Env->CallVoidMethod(button, setText_button, Env->NewStringUTF(text.data()));}
}

效果图

[jni] [android] 用C++开发安卓程序相关推荐

  1. 用Python来开发安卓程序:(1)BeeWare安卓开发环境的搭建

    文章目录 1. 前言 2. BeeWare简介 3. 开发环境搭建注意事项 4. 安装BeeWare 5. 开发环境搭建 5.1 创建项目 5.1.1 创建一个新项目 5.2 运行项目 5.3 打包项 ...

  2. android 多界面开发,安卓开发教程(Android多界面应用程序开发)

    安卓开发教程(Android多界面应用程序开发) 开篇 本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分. 建议精读,深刻理解大意.多做实践.多写代码. 本文章由做全栈攻城狮原创首发. 同名 ...

  3. python开发安卓程序-如何使用python开发android应用

    Python是一种面向对象.解释型计算机程序设计语言,其源代码和解释器CPython遵循GPL(GNU General Public License)协议Python语法简洁清晰,特色之一是强制用空白 ...

  4. python开发安卓程序-如何使用python开发Android手机应用?

    在使用python开发android应用之前我们需要准备好环境,环境需要安装PythonForAndroid,然后开始编程,编程时打开eclipse, 创建一个新的android project &q ...

  5. python开发安卓程序-用python开发android应用(1)

    Python是动态语言,比较简洁.Android不直接支持使用python开发应用,需要使用其它中间件或者库.PythonForAndroid提供了在android平台上对python语言的支持:CL ...

  6. python开发安卓程序-python可以编写android程序吗?

    python可以编写android程序吗?答案是肯定的.Android不直接支持使用python开发应用,需要使用其它中间件或者库.PythonForAndroid.CLE以及Wrapandroid ...

  7. python怎么开发安卓程序_怎样用python开发安卓app-到底如何使用Python开发Android程序.txt...

    Python是一种动态语言,是比较简单的. Android不直接支持使用Python开发的应用程序,它需要使用它的中间件或数据库.它提供了在Android平台上的Python语言的支持; Python ...

  8. android 平板hdmi开发,安卓平板电脑的新突破口:HDMI in 视频输入,取代便携显示器...

    不知道从什么时候开始,便携显示器进入了小部分数码玩家的生活中,有人喜欢将其与任天堂Switch连接,有人喜欢将其作为笔记本电脑的扩展屏,甚至还有一部分用户,则通过智能手机与便携显示器连接,从而实现安卓 ...

  9. 运用JAVA开发安卓程序

    配置环境变量. 并安装eclipse到D盘,打开eclipse创建安卓应用. 创建安卓模拟器,并在其上运行. 将要修改的图标复制粘贴到目录中. 更改图标名称并打包

最新文章

  1. js regex var highlight
  2. 单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)
  3. Quartz.net通过配置文件来完成作业调度
  4. 一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等...
  5. 使用zerorpc踩的第一个坑:
  6. 作者:宾军志(1976-),男,御数坊(北京)科技咨询有限公司联合创始人。...
  7. WORD给文档设置密码保护?
  8. python tornado高并发_tornado IO并发真的很高么?
  9. c语言枪图形,6个变态的C语言Hello World程序[转载]
  10. Python 基础 —— Python程序员常犯的那些错误
  11. Spark 学习(三) RDD基本介绍
  12. android从本地图片导入应用,android – 将图像添加到图库
  13. 懂商业的技术合伙人(7):怎样快速开发一个APP(2)
  14. [境内法规]中国人民银行关于印发《反洗钱现场检查管理办法(试行)》的通知—银发〔2007〕175号
  15. spyder python下载_Spyder Python软件-Spyder Python下载-最火软件站
  16. android动画素材下载,Android Lottie动画使用
  17. 数据库查询三个以上名字重复的数据
  18. 文本框导入图片并显示到页面上
  19. 在线教育如何做好直播?
  20. MATLAB中的CVX包使用中的错误:Cannot perform the operation: {convex} .* {convex}

热门文章

  1. AI测试中的数据收集
  2. CVE-2017-7494紧急预警:Samba蠕虫级提权漏洞,攻击代码已在网上扩散
  3. 30岁以上,没人脉、没资源、工作不顺心、更没钱,这4个小生意,拿去就可以干,只要你肯努力,就可以翻身
  4. flux和redux
  5. ice通信原理_通信原理_知到网课答案
  6. Qt绘制曲线图(基于qt画图QPainter)
  7. Linux树莓派开发——刷机
  8. 车载计算机维修,车载电脑硬件故障及检修
  9. 学成在线HTML代码,学成在线页面制作(HTML+CSS部分)(顶部+轮播图部分)
  10. 《机器学习》 线性模型