温州阿里云代理商:android ndk 短信

发送实例:

使用 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>

//定义标签

温州阿里云代理商:android ndk 短信

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

(0)
luotuoemo的头像luotuoemo
上一篇 2024年3月11日 14:09
下一篇 2024年3月11日 14:26

相关推荐

  • 蚌埠阿里云企业邮箱代理商:钉钉邮箱上传附件打不开wps云文档怎么办

    蚌埠阿里云企业邮箱代理商:钉钉邮箱上传附件打不开wps云文档怎么办 问题描述:最近,一些用户反馈他们在使用蚌埠阿里云企业邮箱中的钉钉邮箱功能时遇到了一个问题:无法打开通过钉钉邮箱上传的wps云文档附件。这个问题给用户的工作带来了一定的困扰,因此我们需要找到解决办法。 分析标题包含的内容:1. 蚌埠阿里云企业邮箱代理商:我们可以看出,作者是蚌埠地区的阿里云企业…

    2024年1月15日
    62900
  • 阿里云企业邮箱代理商:我能否在阿里云企业邮箱中设置智能提醒?

    阿里云企业邮箱智能提醒功能详解 什么是阿里云企业邮箱的智能提醒 阿里云企业邮箱作为国内领先的企业级邮件服务解决方案,其智能提醒功能是针对高效办公场景设计的实用工具。该功能可根据用户预先设置的规则,对重要邮件进行智能识别并触发提醒机制,确保用户不会错过任何关键业务信息。 智能提醒的核心应用场景 在实际应用中,智能提醒可满足多种企业通信需求:当特定联系人(如重要…

    2025年9月27日
    67000
  • 柳州阿里云代理商:阿里云服务器认证证书

    阿里云服务器认证证书是指在使用阿里云服务器时,需要进行认证的证书。该证书通常用于验证服务器的真实性和可信度,确保用户在使用阿里云服务器时的数据安全。 柳州阿里云代理商可以帮助用户获取阿里云服务器认证证书,具体操作流程如下: 登录阿里云官网,进入阿里云认证证书服务页面。 选择需要认证的服务器类型,如云服务器 ECS、负载均衡等。 根据服务器的实际情况选择认证证…

    2023年12月19日
    66800
  • 磐石阿里云代理商:如何使用阿里云服务器搭建智能文化和数据库系统?

    要使用阿里云服务器搭建智能文化和数据库系统,您可以按照以下步骤进行操作: 购买阿里云服务器:登录阿里云官网,选择合适的服务器类型和配置,购买并开通服务器实例。 配置服务器:登录阿里云控制台,进入服务器管理页面,对服务器实例进行基本的设置和配置,包括网络配置、安全组规则等。 安装操作系统:根据您的需求选择合适的操作系统,如Windows Server或Linu…

    2023年11月14日
    62800
  • 阿里云数据库实验室

    阿里云数据库实验室是阿里云数据库团队开设的一个实验室,旨在研究和开发新的数据库技术和解决方案,以提供高效、可靠的数据库服务。实验室团队由一批经验丰富的数据库专家组成,他们致力于数据库性能优化、可扩展性、高可用性、安全性和故障恢复等方面的研究。实验室也与学术界、行业研究机构和合作伙伴紧密合作,推进数据库领域的创新和发展。通过实验室的研究成果,阿里云数据库能够不…

    2023年8月9日
    73600

发表回复

登录后才能评论

联系我们

4000-747-360

在线咨询: QQ交谈

邮件:ixuntao@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
购买阿里云服务器请访问:https://www.4526.cn/