首先为什么要用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. 以Spring整合EhCache为例从根本上了解Spring缓存这件事(转)

    前两节"Spring缓存抽象"和"基于注解驱动的缓存"是为了更加清晰的了解Spring缓存机制,整合任何一个缓存实现或者叫缓存供应商都应该了解并清楚前两节,如果 ...

  2. 【重拾Effective Java】一

    之前看这本<Effective Java(第二版)>都是非常早曾经了.这本书确实是本好书.须要细嚼慢咽,每次看都有不同的体验. 在此写博客巩固一下. 第一章.创建和销毁对象 考虑用静态工厂 ...

  3. [Node] Run Any Version of a Node Tool with npx

    As node projects evolve, new features are added all the time. This results in different errors or re ...

  4. angular项目国际化配置(ngx-translate)

    原文 https://www.jianshu.com/p/7d1da3098625 大纲 1.认识ngx-translate 2.ngx-translate的配置步骤 3.ngx-translate的 ...

  5. [CSS] Reduce Ambiguity in Class Names using a Naming Convention

    A solid naming convention makes it less likely to run into naming conflicts and helps establish a se ...

  6. JavaScript、Ajax与jQuery的关系 分类: C1_HTML/JS/JQUERY 2014-07-31 10:15 3388人阅读 评论(0) 收藏

    简单总结: 1.JS是一门前端语言. 2.Ajax是一门技术,它提供了异步更新的机制,使用客户端与服务器间交换数据而非整个页面文档,实现页面的局部更新. 3.jQuery是一个框架,它对JS进行了封装 ...

  7. Velocity浅析及与Jsp、Freemarker对比 分类: B1_JAVA 2014-07-21 09:14 637人阅读 评论(0) 收藏

    转载自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html Velocity 是一个基于java 的模板引擎(templa ...

  8. ORACLE会话数、连接数配置

    ORACLE会话数.连接数配置 ORACLE会话数.连接数配置 ORACLE的会话数和连接数参数配置 以sysdba身份登录 sqlplus sys/xxxx as sysdba; 查看最大连接数: ...

  9. spring mvc 解决csrf跨站请求攻击

    http://www.dewen.net.cn/q/935/spring+mvc+%E8%A7%A3%E5%86%B3csrf%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82% ...

  10. Dynamips GNS3

    https://baike.baidu.com/item/dynamips Dynamips的原始名称为Cisco 7200 Simulator,源于Christophe Fillot在2005年8月 ...