IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JNI例子 -> 正文阅读

[Java知识库]JNI例子

实例见https://blog.csdn.net/u010349644/article/details/80816701

这个是android源代码(android R)

frameworks/base/media/java/android/media/MediaRecorder.java
public class MediaRecorder implements AudioRouting,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AudioRecordingMonitor,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AudioRecordingMonitorClient,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MicrophoneDirection
{
? ? ?static {
? ? ? ? ?System.loadLibrary("media_jni");
? ? ? ? ?native_init();
? ? ?}
? @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
? ? ? private static native final void native_init();
??
? ? ? @UnsupportedAppUsage
? ? ? private native final void native_setup(Object mediarecorder_this,
? ? ? ? ? ? ? String clientName, String opPackageName) throws IllegalStateException;

?@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
? ? ? private native final void native_finalize();
??
? ? ? @UnsupportedAppUsage
? ? ? private native void setParameter(String nameValuePair);

?public int getPortId() {
? ? ? ? ? if (mNativeContext == 0) {
? ? ? ? ? ? ? return 0;
? ? ? ? ? }
? ? ? ? ? return native_getPortId();
? ? ? }
??
? ? ? private native int native_getPortId();

? ?public void setAudioSamplingRate(int samplingRate) {
? ? ? ? ?if (samplingRate <= 0) {
? ? ? ? ? ? ?throw new IllegalArgumentException("Audio sampling rate is not positive");
? ? ? ? ?}
? ? ? ? ?setParameter("audio-param-sampling-rate=" + samplingRate);
? ? ?}
--------------------------------------------------

frameworks/base/media/jni/android_media_MediaRecorder.cpp

// ref-counted object for callbacks
class JNIMediaRecorderListener: public MediaRecorderListener
{
public:
? ? JNIMediaRecorderListener(JNIEnv* env, jobject thiz, jobject weak_thiz);
? ? ~JNIMediaRecorderListener();
? ? void notify(int msg, int ext1, int ext2);
private:
? ? JNIMediaRecorderListener();
? ? jclass ? ? ?mClass; ? ? // Reference to MediaRecorder class
? ? jobject ? ? mObject; ? ?// Weak ref to MediaRecorder Java object to call on
};

JNIMediaRecorderListener::JNIMediaRecorderListener(JNIEnv* env, jobject thiz, jobject weak_thiz)
{

? ? // Hold onto the MediaRecorder class for use in calling the static method
? ? // that posts events to the application thread.
? ? jclass clazz = env->GetObjectClass(thiz);
? ? if (clazz == NULL) {
? ? ? ? ALOGE("Can't find android/media/MediaRecorder");
? ? ? ? jniThrowException(env, "java/lang/Exception", NULL);
? ? ? ? return;
? ? ?}
? ? ?mClass = (jclass)env->NewGlobalRef(clazz);
?
? ? ?// We use a weak reference so the MediaRecorder object can be garbage collected.
? ? ?// The reference is only used as a proxy for callbacks.
? ? ?mObject ?= env->NewGlobalRef(weak_thiz);
?}
?
?JNIMediaRecorderListener::~JNIMediaRecorderListener()
?{
? ? ?// remove global references
? ? ?JNIEnv *env = AndroidRuntime::getJNIEnv();
? ? ?env->DeleteGlobalRef(mObject);
? ? ?env->DeleteGlobalRef(mClass);
?}
?
?void JNIMediaRecorderListener::notify(int msg, int ext1, int ext2)
?{
? ? ?ALOGV("JNIMediaRecorderListener::notify");
?
? ? ?JNIEnv *env = AndroidRuntime::getJNIEnv();
? ? ?env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, NULL);
?}
?

?static void
?android_media_MediaRecorder_setParameter(JNIEnv *env, jobject thiz, jstring params)
?{
? ? ?ALOGV("setParameter()");
? ? ?if (params == NULL)
? ? ?{
? ? ? ? ?ALOGE("Invalid or empty params string. ?This parameter will be ignored.");
? ? ? ? ?return;
? ? ?}
?
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return;
? ? ?}
?
? ? ?const char* params8 = env->GetStringUTFChars(params, NULL);
? ? ?if (params8 == NULL)
? ? ?{
? ? ? ? ?ALOGE("Failed to covert jstring to String8. ?This parameter will be ignored.");
? ? ? ? ?return;
? ? ?}
?
? ? ?process_media_recorder_call(env, mr->setParameters(String8(params8)), "java/lang/RuntimeException", "setParameter failed.");
? ? ?env->ReleaseStringUTFChars(params,params8);
?}
?
?
?static void
?android_media_MediaRecorder_start(JNIEnv *env, jobject thiz)
?{
? ? ?ALOGV("start");
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return;
? ? ?}
? ? ?process_media_recorder_call(env, mr->start(), "java/lang/RuntimeException", "start failed.");
?}
?
?static void
?android_media_MediaRecorder_stop(JNIEnv *env, jobject thiz)
?{
? ? ?ALOGV("stop");
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return;
? ? ?}
? ? ?process_media_recorder_call(env, mr->stop(), "java/lang/RuntimeException", "stop failed.");
?}
?
?static void
?android_media_MediaRecorder_pause(JNIEnv *env, jobject thiz)
?{
? ? ?ALOGV("pause");
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return;
? ? ?}
? ? ?process_media_recorder_call(env, mr->pause(), "java/lang/RuntimeException", "pause failed.");
?}
?
?static void
?android_media_MediaRecorder_resume(JNIEnv *env, jobject thiz)
?{
? ? ?ALOGV("resume");
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return;
? ? ?}
? ? ?process_media_recorder_call(env, mr->resume(), "java/lang/RuntimeException", "resume failed.");
?}
?
?static void
?android_media_MediaRecorder_native_reset(JNIEnv *env, jobject thiz)
?{
? ? ?ALOGV("native_reset");
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return;
? ? ?}
? ? ?process_media_recorder_call(env, mr->reset(), "java/lang/RuntimeException", "native_reset failed.");
?}
?
?static void
?android_media_MediaRecorder_release(JNIEnv *env, jobject thiz)
?{
? ? ?ALOGV("release");
? ? ?sp<MediaRecorder> mr = setMediaRecorder(env, thiz, 0);
? ? ?if (mr != NULL) {
? ? ? ? ?mr->setListener(NULL);
? ? ? ? ?mr->release();
? ? ?}
?}
?
?// This function gets some field IDs, which in turn causes class initialization.
?// It is called from a static block in MediaRecorder, which won't run until the
?// first time an instance of this class is used.
?static void
?android_media_MediaRecorder_native_init(JNIEnv *env)
?{
? ? ?jclass clazz;
?
? ? ?clazz = env->FindClass("android/media/MediaRecorder");
? ? ?if (clazz == NULL) {
? ? ? ? ?return;
? ? ?}
?
? ? ?fields.context = env->GetFieldID(clazz, "mNativeContext", "J");
? ? ?if (fields.context == NULL) {
? ? ? ? ?return;
? ? ?}
?
? ? ?fields.surface = env->GetFieldID(clazz, "mSurface", "Landroid/view/Surface;");
? ? ?if (fields.surface == NULL) {
? ? ? ? ?return;
? ? ?}
?
? ? ?jclass surface = env->FindClass("android/view/Surface");
? ? ?if (surface == NULL) {
? ? ? ? ?return;
? ? ?}
?
? ? ?fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "(Ljava/lang/Object;IIILjava/lang/Object;)V");
? ? ?if (fields.post_event == NULL) {
? ? ? ? ?return;
? ? ?}
?
? ? ?clazz = env->FindClass("java/util/ArrayList");
? ? ?if (clazz == NULL) {
? ? ? ? ?return;
? ? ?}
? ? ?gArrayListFields.add = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
? ? ?gArrayListFields.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
?}
?
?
?static void
?android_media_MediaRecorder_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? jstring packageName, jstring opPackageName)
?{
? ? ?ALOGV("setup");
?
? ? ?ScopedUtfChars opPackageNameStr(env, opPackageName);
?
? ? ?sp<MediaRecorder> mr = new MediaRecorder(String16(opPackageNameStr.c_str()));
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
? ? ? ? ?return;
? ? ?}
? ? ?if (mr->initCheck() != NO_ERROR) {
? ? ? ? ?jniThrowException(env, "java/lang/RuntimeException", "Unable to initialize media recorder");
? ? ? ? ?return;
? ? ?}
?
? ? ?// create new listener and give it to MediaRecorder
? ? ?sp<JNIMediaRecorderListener> listener = new JNIMediaRecorderListener(env, thiz, weak_this);
? ? ?mr->setListener(listener);
?
? ? ?// Convert client name jstring to String16
? ? ?const char16_t *rawClientName = reinterpret_cast<const char16_t*>(
? ? ? ? ?env->GetStringChars(packageName, NULL));
? ? ?jsize rawClientNameLen = env->GetStringLength(packageName);
? ? ?String16 clientName(rawClientName, rawClientNameLen);
? ? ?env->ReleaseStringChars(packageName,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?reinterpret_cast<const jchar*>(rawClientName));
?
? ? ?// pass client package name for permissions tracking
? ? ?mr->setClientName(clientName);
?
? ? ?setMediaRecorder(env, thiz, mr);
?}
?
?static void
?android_media_MediaRecorder_native_finalize(JNIEnv *env, jobject thiz)
?{
? ? ?ALOGV("finalize");
? ? ?android_media_MediaRecorder_release(env, thiz);
?}
?
?
?static void
?android_media_MediaRecorder_enableDeviceCallback(JNIEnv *env, jobject thiz, jboolean enabled)
?{
? ? ?ALOGV("android_media_MediaRecorder_enableDeviceCallback %d", enabled);
?
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return;
? ? ?}
?
? ? ?process_media_recorder_call(env, mr->enableAudioDeviceCallback(enabled),
? ? ? ? ? ? ?"java/lang/RuntimeException", "enableDeviceCallback failed.");
?}
?

?
?static jint android_media_MediaRecord_getPortId(JNIEnv *env, ?jobject thiz) {
? ? ?sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
? ? ?if (mr == NULL) {
? ? ? ? ?jniThrowException(env, "java/lang/IllegalStateException", NULL);
? ? ? ? ?return (jint)AUDIO_PORT_HANDLE_NONE;
? ? ?}
?
? ? ?audio_port_handle_t portId;
? ? ?process_media_recorder_call(env, mr->getPortId(&portId),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"java/lang/RuntimeException", "getPortId failed.");
? ? ?return (jint)portId;
?}
?
?// ----------------------------------------------------------------------------
?
?static const JNINativeMethod gMethods[] = {
? ? ?{"setParameter", ? ? ? ? "(Ljava/lang/String;)V", ? ? ? ? ? (void *)android_media_MediaRecorder_setParameter},
? ? ?{"start", ? ? ? ? ? ? ? ?"()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_start},
? ? ?{"stop", ? ? ? ? ? ? ? ? "()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_stop},
? ? ?{"pause", ? ? ? ? ? ? ? ?"()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_pause},
? ? ?{"resume", ? ? ? ? ? ? ? "()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_resume},
? ? ?{"native_reset", ? ? ? ? "()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_native_reset},
? ? ?{"release", ? ? ? ? ? ? ?"()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_release},
? ? ?{"native_init", ? ? ? ? ?"()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_native_init},
? ? ?{"native_setup", ? ? ? ? "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(void *)android_media_MediaRecorder_native_setup},
? ? ?{"native_finalize", ? ? ?"()V", ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void *)android_media_MediaRecorder_native_finalize},
? ? ?{"native_setInputSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaRecorder_setInputSurface },
?
?};
?
?// This function only registers the native methods, and is called from
?// JNI_OnLoad in android_media_MediaPlayer.cpp
?int register_android_media_MediaRecorder(JNIEnv *env)
?{
? ? ?return AndroidRuntime::registerNativeMethods(env,
? ? ? ? ? ? ? ? ?"android/media/MediaRecorder", gMethods, NELEM(gMethods));
?}
?

/frameworks/base/media/jni/android_media_MediaPlayer.cpp
extern int register_android_media_MediaRecorder(JNIEnv *env);

? jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
? {
? ? ? JNIEnv* env = NULL;
? ? ? jint result = -1;
??
? ? ? if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
? ? ? ? ? ALOGE("ERROR: GetEnv failed\n");
? ? ? ? ? goto bail;
? ? ? }
? ? ? assert(env != NULL);
...
?if (register_android_media_MediaRecorder(env) < 0) {
? ? ? ? ? ALOGE("ERROR: MediaRecorder native registration failed\n");
? ? ? ? ? goto bail;
? ? ? }

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:19:45  更:2021-07-13 17:21:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 19:01:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码