用C++写android程序(包含界面+发短信)

摘要:
InputType=“textMultiLine”/&gt:MasonMainActivity。java[cpp]viewplain复制导入com.ss。jni中。JNIUtil;import android.app.Activity;jfieldID fieldID_ main=env->jint main=env->

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

首先上效果图:

首先是发短信图:

用C++写android程序(包含界面+发短信)第1张

其次是设计的效果图:

用C++写android程序(包含界面+发短信)第2张

接下来上代码:

我们先设计布局:

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

免责声明:文章转载自《用C++写android程序(包含界面+发短信)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇网络通信框架Apache MINAvs2017 编译最新chromium下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

1/28 对于Vue.js 中 Object.freeze( )的理解

开门见山先总结,如有错误,大佬请指正 1. const  用于单一的变量上,对于对象的属性,const 不能做到 阻止 添加、修改 对象属性 2. freeze 只要是 对象 都可以 阻止 其发生改变 ( 弥补了 const 的不足,即 不能阻止 添加 修改属性) 3. Vue 是响应式的,所以对于 data 是无法 freeze 的   ( /* 上面的...

微信小程序实现给循环列表点击添加类(单项和多项)

在微信小程序里面没有DOM对象, 不能操作DOM. 所有的操作通过数据来实现,下面主要实现了给循环列表点击添加类的操作 一、单项 目标需求:实现下图,给点击的view增加类,每次只能选择一个。 主要思路:给点击的view增加类,依靠点击的index对state进行赋值。如果相同时,给该view增加类。 实现代码: .wxml文件 <view>...

elementui 在表格表头里面添加按钮

在表格表头里面添加按钮  在列中动态绑定 :render-header,             <el-table-column align='center'                 prop="dataSource"                 label="数据源"                 width="200" :re...

Map、List、Set在Java中的各种遍历方法

一、Map的4种遍历 Map<String, String> map = new HashMap<String, String>(); map.put("姓名", "张三"); map.put("属性", "好人"); 1、普遍使用,二次取值 for (String key : map.keySet()) {...

C#位运算讲解与示例

今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加           k2=4 ; //删除           k3=8; //修改           ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。 如:          purview = k2|k3; //...

微信小程序如何播放音频,这里以本地mp3文件举例。

参考:https://blog.csdn.net/bangyiqing/article/details/104966135      官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.html Page({ data: {...