zoukankan      html  css  js  c++  java
  • 用C++写android程序(包含界面+发短信)

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

    首先上效果图:

    首先是发短信图:

    其次是设计的效果图:

    接下来上代码:

    我们先设计布局:

    main.xml如下:

    [cpp] view plain copy
     
    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.   
    7.       <EditText   
    8.         android:layout_width="fill_parent"  
    9.         android:layout_height="wrap_content"  
    10.         android:id="@+id/str1"   
    11.         android:inputType="textMultiLine"/>  
    12.         
    13.        <EditText   
    14.         android:layout_width="fill_parent"  
    15.         android:layout_height="wrap_content"  
    16.         android:id="@+id/str2"   
    17.         android:inputType="textMultiLine"/>  
    18.   
    19. </LinearLayout>  

    接下来是MasonMainActivity.java

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

    声明native方法的JNIUtil.java

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

    接下来主要就是C++了

    [cpp] view plain copy
     
    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.   
    14.     //调用setContentView方法  
    15.     jmethodID methodID_func = env->GetMethodID(native_clazz1, "setContentView",  
    16.             "(I)V");  
    17.     if (methodID_func == 0) {  
    18.         LOGI("GetMethodID methodID_func error");  
    19.         return;  
    20.     }  
    21.     env->CallVoidMethod(thiz, methodID_func, main);  
    22.   
    23.     //获取R.id中的str1值  
    24.     jclass native_str1 = env->FindClass("com/ss/R$id");  
    25.     jfieldID fieldID_str = env->GetStaticFieldID(native_str1, "str1", "I");  
    26.     jint str1 = env->GetStaticIntField(native_str1, fieldID_str);  
    27.     LOGI("str is %d", str1);  
    28.     jclass native_str1_1 = env->FindClass("android/app/Activity");  
    29.     if (native_str1_1 == 0) {  
    30.         LOGI("FindClass native_str1 error");  
    31.         return;  
    32.     }  
    33.   
    34.   
    35.     //调用findViewById方法  
    36.     jmethodID methodID_str1 = env->GetMethodID(native_str1_1, "findViewById",  
    37.             "(I)Landroid/view/View;");  
    38.   
    39.     if (methodID_str1 == 0) {  
    40.         LOGI("GetMethodID methodID_func error");  
    41.         return;  
    42.     }  
    43.     jobject str1_id = env->CallObjectMethod(thiz, methodID_str1, str1);  
    44.   
    45.     jclass native_TextView = env->FindClass("android/widget/TextView");  
    46.     if (native_TextView == 0) {  
    47.         LOGI("FindClass native_TextView error");  
    48.         return;  
    49.     }  
    50.   
    51.     //调用setText方法  
    52.     jmethodID methodID_TextView = env->GetMethodID(native_TextView, "setText",  
    53.             "(Ljava/lang/CharSequence;)V");  
    54.   
    55.     if (methodID_TextView == 0) {  
    56.         LOGI("GetMethodID methodID_func error");  
    57.         return;  
    58.     }  
    59.   
    60.     jstring text = env->NewStringUTF("hello");  
    61.     env->CallVoidMethod(str1_id, methodID_TextView, text);  
    62.   
    63.     LOGI("to here");  
    64.   
    65.   
    66.     //发短信  
    67.     jclass smsclazz = env->FindClass("android/telephony/SmsManager");  
    68.     if (smsclazz) {  
    69.         jmethodID get = env->GetStaticMethodID(smsclazz, "getDefault",  
    70.                 "()Landroid/telephony/SmsManager;");  
    71.         jobject sms = env->NewObject( smsclazz, get); //获得sms对象  
    72.   
    73.         jmethodID send =  
    74.                 env->GetMethodID( smsclazz, "sendTextMessage",  
    75.                         "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V");  
    76.   
    77.         jstring destinationAddress = env->NewStringUTF( "1234567890"); //发送短信的地址  
    78.         jstring text = env->NewStringUTF( "native"); //短信内容  
    79.         if (send) {  
    80.             env->CallVoidMethod(sms, send, destinationAddress, NULL,  
    81.                     text, NULL, NULL);  
    82.         }  
    83.     }  
    84.   
    85. }  

    完成。

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

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

  • 相关阅读:
    [刷题] 1023 组个最小数 (20分)
    [刷题] 1018 锤子剪刀布 (20分)
    Leetcode 542 01矩阵 图的按距离遍历
    Leetcode 515 每个树行中的最大值 BFS
    Leetcode17.12 BiNode 中序遍历
    Leetcode 513 树左下角的值 DFS 与 BFS
    leetcode 787 K 站中最便宜的航班 DP
    数据可视化基础专题(43):NUMPY基础(8)切片和索引,高级索引(二) 高级索引
    数据可视化基础专题(42):NUMPY基础(7)切片和索引,高级索引(一)
    数据可视化基础专题(41):NUMPY基础(6)数组创建(3) 从数值范围创建数组
  • 原文地址:https://www.cnblogs.com/findumars/p/7995542.html
Copyright © 2011-2022 走看看