首先為什么要用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 點擊打開鏈接
http://blog.csdn.net/bupt073114/article/details/39852461