发送实例:
使用 Android NDK 发送短信通常需要在 C/C++ 代码中调用 Java API。以下是一个简单的示例,它使用 JNI,发送一条短信:
Java 代码:
public class SMSHelper {
public static void sendMessage(String phoneNo, String message) {
try {
SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> messageParts = smsManager.divideMessage(message);
smsManager.sendMultipartTextMessage(phoneNo, null, messageParts, null, null);
} catch (Exception ex) {
// handle exception here
}
}
}
C/C++ 代码:
JNIEXPORT void JNICALL Java_com_demo_sms_SMSHelper_sendMessage(JNIEnv * env, jobject obj, jstring phoneNo, jstring message) {
const char * phoneNoChars = env->GetStringUTFChars(phoneNo, 0);
const char * messageChars = env->GetStringUTFChars(message, 0);
jclass smsHelperClass = env->FindClass("com/demo/sms/SMSHelper");
jmethodID sendMessageMethodID = env->GetStaticMethodID(smsHelperClass, "sendMessage", "(Ljava/lang/String;Ljava/lang/String;)V");
env->CallStaticVoidMethod(smsHelperClass, sendMessageMethodID, env->NewStringUTF(phoneNoChars), env->NewStringUTF(messageChars));
env->ReleaseStringUTFChars(phoneNo, phoneNoChars);
env->ReleaseStringUTFChars(message, messageChars);
}
这使我们可以从我们的 C/C++ 代码中调用 Java 类 SMSHelper 中的静态方法 sendMessage。
这里,我们首先通过函数 GetStringUTFChars 从 jstring 参数中取得 C/C++ 字符串,然后调用 JNI 函数调用 Java API。在这种情况下,我们需要在 JNI 运行时中搜索 SMSHelper 类,并获取静态方法的方法 ID。然后,我们使用 JNI 函数调用 CallStaticVoidMethod 在 Java 方法中调用 sendMessage。最后,使用 ReleaseStringUTFChars 释放从 jstring 中检索的 C/C++ 字符串。
注意,在 JNI 中声明 Java 中的方法时,方法名和参数类型应该按照 Java API 的格式来写,例如:
Java 中的方法声明:
public static void sendMessage(String phoneNo, String message)
JNI 中的方法声明:
JNIEXPORT void JNICALL Java_com_demo_sms_SMSHelper_sendMessage(JNIEnv * env, jobject obj, jstring phoneNo, jstring message)
发送实例代码
以下是一个简单的Android NDK短信发送示例代码:
include <jni.h>
include <android/log.h>
include <string.h>
include <stdlib.h>
include <stdio.h>
include <stdbool.h>
//定义标签
define TAG “SMS_SEND”
define LOGD(…) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
JNIEXPORT jstring JNICALL Java_com_example_ndksmssend_MainActivity_sendSms(JNIEnv *env, jobject obj, jstring number, jstring message){
LOGD("Android NDK SMS Send From");
//将Java字符串转换为C字符串
const char *c_number = (*env)->GetStringUTFChars(env, number, NULL);
const char *c_message = (*env)->GetStringUTFChars(env, message, NULL);
//使用adb shell发送SMS命令
char cmd[2048] = "";
sprintf(cmd, "adb shell service call isms 7 i32 0 s16 "%s" s16 "com.android.contacts" s16 "%s" s16 "null" s16 "null" i32 -1 i32 -1 i32 0", c_number, c_message);
int ret = system(cmd);
//释放字符串
(*env)->ReleaseStringUTFChars(env, number, c_number);
(*env)->ReleaseStringUTFChars(env, message, c_message);
//返回处理结果
if(ret == 0){
return (*env)->NewStringUTF(env, "SMS Send Success.");
}else{
return (*env)->NewStringUTF(env, "SMS Send Failed.");
}
}
使用方法:
在MainActivity.java中使用以下代码调用本地方法:
public native String sendSms(String number, String message);
编译和运行:
ndk-build
adb push libs / data / local / tmp / ndk-jni
adb shell
cd / data / local / tmp / ndk-jni
chmod 755 ndk-jni-test
./ndk-jni-test
注意事项:
必须使用adb shell命令发送SMS。
需要在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
需要在build.gradle文件中添加以下内容:
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
defaultConfig {
...
ndk {
moduleName "ndk_jni"
cFlags "-std=c99"
ldLibs "log"
abiFilters "armeabi-v7a", "x86"
}
}
...
}
需要将本地方法调用包含在try-catch块中,以避免未处理的异常。
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/159500.html