首先为什么要用C++写android程序呢?主要是因为java写的android程序太容易被发编译,相对于java编译后的dex文件,底层的native so更加不容易被反编译,所以为了安全起见,可以将一些程序的逻辑写到C++里面,下面我们就写一个activity,其中核心内容都写在C++里面。我们写一个演示界面,其中后台发一条短信(所有逻辑都在C++中)。现在一些安全公司把代码全都写到C++中,我做的主要是为了安全~

首先上效果图:

首先是发短信图:

其次是设计的效果图:

接下来上代码:

我们先设计布局:

main.xml如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <EditText
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:id="@+id/str1"
  10. android:inputType="textMultiLine"/>
  11. <EditText
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content"
  14. android:id="@+id/str2"
  15. android:inputType="textMultiLine"/>
  16. </LinearLayout>

接下来是MasonMainActivity.java

  1. import com.ss.jni.JNIUtil;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class MasonMainActivity extends Activity {
  5. /** Called when the activity is first created. */
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. JNIUtil.nativec(this);
  10. }
  11. }

声明native方法的JNIUtil.java

  1. import android.content.Context;
  2. import android.os.Bundle;
  3. public class JNIUtil {
  4. static {
  5. System.loadLibrary("rusteze");
  6. }
  7. public static native void nativec(Context con);
  8. }

接下来主要就是C++了

  1. void Java_com_ss_jni_JNIUtil_nativec(JNIEnv *env, jclass thizz,
  2. jobject thiz) {
  3. //获取R.layout中的main值
  4. jclass native_clazz = env->FindClass("com/ss/R$layout");
  5. jfieldID fieldID_main = env->GetStaticFieldID(native_clazz, "main", "I");
  6. jint main = env->GetStaticIntField(native_clazz, fieldID_main);
  7. LOGI("main is %d", main);
  8. jclass native_clazz1 = env->FindClass("android/app/Activity");
  9. if (native_clazz1 == 0) {
  10. LOGI("FindClass native_clazz1 error");
  11. return;
  12. }
  13. //调用setContentView方法
  14. jmethodID methodID_func = env->GetMethodID(native_clazz1, "setContentView",
  15. "(I)V");
  16. if (methodID_func == 0) {
  17. LOGI("GetMethodID methodID_func error");
  18. return;
  19. }
  20. env->CallVoidMethod(thiz, methodID_func, main);
  21. //获取R.id中的str1值
  22. jclass native_str1 = env->FindClass("com/ss/R$id");
  23. jfieldID fieldID_str = env->GetStaticFieldID(native_str1, "str1", "I");
  24. jint str1 = env->GetStaticIntField(native_str1, fieldID_str);
  25. LOGI("str is %d", str1);
  26. jclass native_str1_1 = env->FindClass("android/app/Activity");
  27. if (native_str1_1 == 0) {
  28. LOGI("FindClass native_str1 error");
  29. return;
  30. }
  31. //调用findViewById方法
  32. jmethodID methodID_str1 = env->GetMethodID(native_str1_1, "findViewById",
  33. "(I)Landroid/view/View;");
  34. if (methodID_str1 == 0) {
  35. LOGI("GetMethodID methodID_func error");
  36. return;
  37. }
  38. jobject str1_id = env->CallObjectMethod(thiz, methodID_str1, str1);
  39. jclass native_TextView = env->FindClass("android/widget/TextView");
  40. if (native_TextView == 0) {
  41. LOGI("FindClass native_TextView error");
  42. return;
  43. }
  44. //调用setText方法
  45. jmethodID methodID_TextView = env->GetMethodID(native_TextView, "setText",
  46. "(Ljava/lang/CharSequence;)V");
  47. if (methodID_TextView == 0) {
  48. LOGI("GetMethodID methodID_func error");
  49. return;
  50. }
  51. jstring text = env->NewStringUTF("hello");
  52. env->CallVoidMethod(str1_id, methodID_TextView, text);
  53. LOGI("to here");
  54. //发短信
  55. jclass smsclazz = env->FindClass("android/telephony/SmsManager");
  56. if (smsclazz) {
  57. jmethodID get = env->GetStaticMethodID(smsclazz, "getDefault",
  58. "()Landroid/telephony/SmsManager;");
  59. jobject sms = env->NewObject( smsclazz, get); //获得sms对象
  60. jmethodID send =
  61. env->GetMethodID( smsclazz, "sendTextMessage",
  62. "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V");
  63. jstring destinationAddress = env->NewStringUTF( "1234567890"); //发送短信的地址
  64. jstring text = env->NewStringUTF( "native"); //短信内容
  65. if (send) {
  66. env->CallVoidMethod(sms, send, destinationAddress, NULL,
  67. text, NULL, NULL);
  68. }
  69. }
  70. }

完成。

APK资源下载链接如下:http://download.csdn.net/detail/bupt073114/8008525 点击打开链接
工程源码如下:https://github.com/buptis073114/TestAndroidJNI 点击打开链接

http://blog.csdn.net/bupt073114/article/details/39852461

用C++写android程序(包含界面+发短信)的更多相关文章

  1. Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)

    结果: 1.不提示发短信卡住,点击没有反映,我猜想,可能是因为我用的是小米手机吧. 2.接收短信报错,我猜想可能是我改了里面的方法吧(哪位大神了解,求指教). 3.project -->opti ...

  2. Android Tips: 打电话和发短信

    利用Android打电话非常简单,直接调用Android内在的电话功能就可以了. btnDail.setOnClickListener(new OnClickListener(){ @Override ...

  3. iOS中打电话、打开网址、发邮件、发短信等

    常用小功能 小功能简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话-方法1 最简单最直接的方式:直接跳到拨号界面 NSURL *url = [ ...

  4. AJ学IOS(45)之常用的小功能比如打电话、打开网址、发邮件、发短信打开其他应用。

    AJ分享,必须精品 简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信.打开其他应用等. 打电话 方法1 最简单最直接的方式:直接跳到拨号界面 NSURL ...

  5. IOS程序开发中-跳转到 发送短信界面 实现发短信

    前言:我发现我标题取的不好,谁帮我取个承接上下文的标题?评论一下,我改 项目需求:在程序开发中,我们需要在某个程序里面发送一些短信验证(不是接收短信验证,关于短信验证,传送门:http://www.c ...

  6. 【百度地图-安卓SDK】从头开始写android程序

    [百度地图-安卓SDK]从头开始写android程序首先确保有这四个文件    安装jdk先安装android开发SDK(并不只是为eclipse服务的),即运行installer_r15-windo ...

  7. Android 单击跳转到打电话发短信界面,长按打电话发短信

    <uses-permission android:name="android.permission.CALL_PHONE"/><uses-permission a ...

  8. iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信

    一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ...

  9. 用qpython3写一个最简单的发送短信的程序

    到目前为止并没有多少手机应用是用python开发的,不过qpython可以作为一个不错的玩具推荐给大家来玩. 写一个最简单的发送短信的程序,代码如下: #-*-coding:utf8;-*- #qpy ...

随机推荐

  1. OC学习篇之—写类别(类的扩展)

    首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首先会想到继承,但是继承有两个问题: 第一个问题:继承的前提是这个类可以被继承,因为在Java中有些类 ...

  2. YASM User Manual

    This document is the user manual for the Yasm assembler. It is intended as both an introduction and ...

  3. Debian 上创建新的用户

    Debian 上创建新的用户 使用Gnome的窗口界面创建 使用Linux的命令创建 添加用户: useradd -d /home/your_username -m your_username 添加密 ...

  4. Java与模式:装饰(Decorator)模式

    装饰模式使用被装饰类的一个子类的实例.把client的调用委派到被装饰类,装饰模式的关键在于这样的扩展是全然透明的.   装饰模式在Java种使用也非常广泛,比方我们在又一次定义button.对话框等 ...

  5. boost::asio的http client应用笔记

    1 踩过的坑 1.1 io_service boost::asio::io_service::run()会一直运行到没有任务为止,假设中途调用stop().则全部等待中的任务会立马运行.要在停止的时候 ...

  6. 【hdu5527】【2015ACM/ICPC亚洲区长春站 】Too Rich

    题目链接: pid=5527">http://acm.hdu.edu.cn/showproblem.php?pid=5527 题意&题解: 感觉自己真是弱啊,自己想的贪心是错的 ...

  7. YUV与RGB格式转换

    YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...

  8. ios开发runtime学习三:动态添加方法(实际应用少,面试)

    #import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...

  9. ios开发网络学习AFN框架的使用一:get和post请求

    #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...

  10. Qt元类型(MetaType)注册门(使用qRegisterMetaType注册错误等级)

    昨天调试项目时,突然发现如下消息: QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL' (Make sure 'ERROR_L ...