[jni] [android] 用C++开发安卓程序
原理
原理其实很简单
首先用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++开发安卓程序相关推荐
- 用Python来开发安卓程序:(1)BeeWare安卓开发环境的搭建
文章目录 1. 前言 2. BeeWare简介 3. 开发环境搭建注意事项 4. 安装BeeWare 5. 开发环境搭建 5.1 创建项目 5.1.1 创建一个新项目 5.2 运行项目 5.3 打包项 ...
- android 多界面开发,安卓开发教程(Android多界面应用程序开发)
安卓开发教程(Android多界面应用程序开发) 开篇 本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分. 建议精读,深刻理解大意.多做实践.多写代码. 本文章由做全栈攻城狮原创首发. 同名 ...
- python开发安卓程序-如何使用python开发android应用
Python是一种面向对象.解释型计算机程序设计语言,其源代码和解释器CPython遵循GPL(GNU General Public License)协议Python语法简洁清晰,特色之一是强制用空白 ...
- python开发安卓程序-如何使用python开发Android手机应用?
在使用python开发android应用之前我们需要准备好环境,环境需要安装PythonForAndroid,然后开始编程,编程时打开eclipse, 创建一个新的android project &q ...
- python开发安卓程序-用python开发android应用(1)
Python是动态语言,比较简洁.Android不直接支持使用python开发应用,需要使用其它中间件或者库.PythonForAndroid提供了在android平台上对python语言的支持:CL ...
- python开发安卓程序-python可以编写android程序吗?
python可以编写android程序吗?答案是肯定的.Android不直接支持使用python开发应用,需要使用其它中间件或者库.PythonForAndroid.CLE以及Wrapandroid ...
- python怎么开发安卓程序_怎样用python开发安卓app-到底如何使用Python开发Android程序.txt...
Python是一种动态语言,是比较简单的. Android不直接支持使用Python开发的应用程序,它需要使用它的中间件或数据库.它提供了在Android平台上的Python语言的支持; Python ...
- android 平板hdmi开发,安卓平板电脑的新突破口:HDMI in 视频输入,取代便携显示器...
不知道从什么时候开始,便携显示器进入了小部分数码玩家的生活中,有人喜欢将其与任天堂Switch连接,有人喜欢将其作为笔记本电脑的扩展屏,甚至还有一部分用户,则通过智能手机与便携显示器连接,从而实现安卓 ...
- 运用JAVA开发安卓程序
配置环境变量. 并安装eclipse到D盘,打开eclipse创建安卓应用. 创建安卓模拟器,并在其上运行. 将要修改的图标复制粘贴到目录中. 更改图标名称并打包
最新文章
- js regex var highlight
- 单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)
- Quartz.net通过配置文件来完成作业调度
- 一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等...
- 使用zerorpc踩的第一个坑:
- 作者:宾军志(1976-),男,御数坊(北京)科技咨询有限公司联合创始人。...
- WORD给文档设置密码保护?
- python tornado高并发_tornado IO并发真的很高么?
- c语言枪图形,6个变态的C语言Hello World程序[转载]
- Python 基础 —— Python程序员常犯的那些错误
- Spark 学习(三) RDD基本介绍
- android从本地图片导入应用,android – 将图像添加到图库
- 懂商业的技术合伙人(7):怎样快速开发一个APP(2)
- [境内法规]中国人民银行关于印发《反洗钱现场检查管理办法(试行)》的通知—银发〔2007〕175号
- spyder python下载_Spyder Python软件-Spyder Python下载-最火软件站
- android动画素材下载,Android Lottie动画使用
- 数据库查询三个以上名字重复的数据
- 文本框导入图片并显示到页面上
- 在线教育如何做好直播?
- MATLAB中的CVX包使用中的错误:Cannot perform the operation: {convex} .* {convex}