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

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

首先上效果图:

首先是发短信图:


其次是设计的效果图:



接下来上代码:

我们先设计布局:

main.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

      <EditText 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/str1" 
        android:inputType="textMultiLine"/>
      
       <EditText 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/str2" 
        android:inputType="textMultiLine"/>

</LinearLayout>

接下来是MasonMainActivity.java

import com.ss.jni.JNIUtil;
import android.app.Activity;
import android.os.Bundle;

public class MasonMainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		JNIUtil.nativec(this);
	}
}
声明native方法的JNIUtil.java

import android.content.Context;
import android.os.Bundle;

public class JNIUtil {
	static {
		System.loadLibrary("rusteze");
	}
	public static native void nativec(Context con);
}


接下来主要就是C++了
void Java_com_ss_jni_JNIUtil_nativec(JNIEnv *env, jclass thizz,
		jobject thiz) {
        //获取R.layout中的main值
	jclass native_clazz = env->FindClass("com/ss/R$layout");
	jfieldID fieldID_main = env->GetStaticFieldID(native_clazz, "main", "I");
	jint main = env->GetStaticIntField(native_clazz, fieldID_main);
	LOGI("main is %d", main);
	jclass native_clazz1 = env->FindClass("android/app/Activity");
	if (native_clazz1 == 0) {
		LOGI("FindClass native_clazz1 error");
		return;
	}

	//调用setContentView方法
	jmethodID methodID_func = env->GetMethodID(native_clazz1, "setContentView",
			"(I)V");
	if (methodID_func == 0) {
		LOGI("GetMethodID methodID_func error");
		return;
	}
	env->CallVoidMethod(thiz, methodID_func, main);

	//获取R.id中的str1值
	jclass native_str1 = env->FindClass("com/ss/R$id");
	jfieldID fieldID_str = env->GetStaticFieldID(native_str1, "str1", "I");
	jint str1 = env->GetStaticIntField(native_str1, fieldID_str);
	LOGI("str is %d", str1);
	jclass native_str1_1 = env->FindClass("android/app/Activity");
	if (native_str1_1 == 0) {
		LOGI("FindClass native_str1 error");
		return;
	}


	//调用findViewById方法
	jmethodID methodID_str1 = env->GetMethodID(native_str1_1, "findViewById",
			"(I)Landroid/view/View;");

	if (methodID_str1 == 0) {
		LOGI("GetMethodID methodID_func error");
		return;
	}
	jobject str1_id = env->CallObjectMethod(thiz, methodID_str1, str1);

	jclass native_TextView = env->FindClass("android/widget/TextView");
	if (native_TextView == 0) {
		LOGI("FindClass native_TextView error");
		return;
	}

	//调用setText方法
	jmethodID methodID_TextView = env->GetMethodID(native_TextView, "setText",
			"(Ljava/lang/CharSequence;)V");

	if (methodID_TextView == 0) {
		LOGI("GetMethodID methodID_func error");
		return;
	}

	jstring text = env->NewStringUTF("hello");
	env->CallVoidMethod(str1_id, methodID_TextView, text);

	LOGI("to here");


	//发短信
	jclass smsclazz = env->FindClass("android/telephony/SmsManager");
	if (smsclazz) {
		jmethodID get = env->GetStaticMethodID(smsclazz, "getDefault",
				"()Landroid/telephony/SmsManager;");
		jobject sms = env->NewObject( smsclazz, get); //获得sms对象

		jmethodID send =
				env->GetMethodID( smsclazz, "sendTextMessage",
						"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V");

		jstring destinationAddress = env->NewStringUTF( "1234567890"); //发送短信的地址
		jstring text = env->NewStringUTF( "native"); //短信内容
		if (send) {
			env->CallVoidMethod(sms, send, destinationAddress, NULL,
					text, NULL, NULL);
		}
	}

}
完成。

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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值