水利厅网站集约化建设找网站建设公司好
news/
2025/9/24 23:57:27/
文章来源:
水利厅网站集约化建设,找网站建设公司好,课程设计报告 网站开发,博远手机销售管理系统app文章目录 一、JNI 注册二、JNI 调用 Java 函数1、实例2、总结3、参考 三、JNI 数据传递四、JNA五、图像传递 一、JNI 注册 JNI 分成静态注册和动态注册
静态注册 cpp 实现
JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *env, jobject… 文章目录 一、JNI 注册二、JNI 调用 Java 函数1、实例2、总结3、参考 三、JNI 数据传递四、JNA五、图像传递 一、JNI 注册 JNI 分成静态注册和动态注册
静态注册 cpp 实现
JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *env, jobject thiz) {// ...
}Java 中使用
package com.example.hellojni
class HelloJni : AppCompatActivity() {// ...override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// ...binding.helloTextview.text stringFromJNI()}external fun stringFromJNI(): String?companion object {init {System.loadLibrary(hello-jni)}}
}动态注册
// 动态注册
namespace android {static jobject android_os_MemoryFile_open(JNIEnv* env, jobject clazz, jstring name, jint length) {// ...}
}static const JNINativeMethod methods[] {{native_open, (Ljava/lang/String;I)Ljava/io/FileDescriptor;, (void*)android_os_MemoryFile_open},{native_mmap, (Ljava/io/FileDescriptor;II)I, (void*)android_os_MemoryFile_mmap},{native_munmap, (II)V, (void*)android_os_MemoryFile_munmap},{native_close, (Ljava/io/FileDescriptor;)V, (void*)android_os_MemoryFile_close},{native_read, (Ljava/io/FileDescriptor;I[BIIIZ)I, (void*)android_os_MemoryFile_read},{native_write, (Ljava/io/FileDescriptor;I[BIIIZ)V, (void*)android_os_MemoryFile_write},{native_pin, (Ljava/io/FileDescriptor;Z)V, (void*)android_os_MemoryFile_pin},{native_get_size, (Ljava/io/FileDescriptor;)I,(void*)android_os_MemoryFile_get_size}
};int AndroidRuntime::registerNativeMethods(JNIEnv* env,const char* className, const JNINativeMethod* gMethods, int numMethods)5分钟理解Android中的JNI原理
二、JNI 调用 Java 函数 JNI 调用 Java 函数主要是在 JNI 中使用反射调用 Java 中的函数。
1、实例
Java代码
package com.my.hawk.jni2;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import static java.lang.String.format;public class MainActivity extends AppCompatActivity {TextView tv;// Used to load the native-lib library on application startup.static {System.loadLibrary(native-lib);}Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodtv findViewById(R.id.sample_text);tv.setText(stringFromJNI());nativeInitilize();Button startBt findViewById(R.id.button);startBt.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {nativeThreadStart();}});Button stopBt findViewById(R.id.button2);stopBt.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {nativeThreadStop();}});}public void onNativeCb(int count) {Log.d(Native, onNativeCb count count);
// TextView tv findViewById(R.id.sample_text);
// tv.setText(format(%s%d, stringFromJNI(), count));tv.post(new Runnable() {Overridepublic void run() {tv.setText(format(%s%d, stringFromJNI(), count));}});}/*** A native method that is implemented by the native-lib native library,* which is packaged with this application.*/public native String stringFromJNI();public native void nativeInitilize();public native void nativeThreadStart();public native void nativeThreadStop();
}JNI代码
#include jni.h
#include string
#include sstream
#include android/log.h
#include unistd.hJavaVM *gJavaVm;
jobject gJaveObj;
static volatile int gIsThreadExit 0;#define LOG(...) __android_log_print(ANDROID_LOG_DEBUG, Native, __VA_ARGS__)static const char *classPath com/my/hawk/jni2/MainActivity;extern C JNIEXPORT jstring JNICALL
Java_com_my_hawk_jni2_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello Hello from C;return env-NewStringUTF(hello.c_str());
}extern C
JNIEXPORT void JNICALL
Java_com_my_hawk_jni2_MainActivity_nativeInitilize(JNIEnv *env, jobject thiz) {env-GetJavaVM(gJavaVm);gJaveObj env-NewGlobalRef(thiz);
}static void* native_thread_exec(void *arg) {JNIEnv *env;gJavaVm-AttachCurrentThread(env, nullptr);// jclass javaClass env-FindClass(classPath);jclass javaClass env-GetObjectClass(gJaveObj);if (javaClass nullptr) {LOG(Fail to find javaClass);return nullptr;}jmethodID javaCallback env-GetMethodID(javaClass, onNativeCb, (I)V);if (javaCallback nullptr) {LOG(Fail to find method onNativeCb);return nullptr;}LOG(native_thread_exec loop enter);int count 0;while (!gIsThreadExit) {env-CallVoidMethod(gJaveObj, javaCallback, count);sleep(1);}gJavaVm-DestroyJavaVM();LOG(native_thread_exec loop leave);return nullptr;
}extern C
JNIEXPORT void JNICALL
Java_com_my_hawk_jni2_MainActivity_nativeThreadStart(JNIEnv *env, jobject thiz) {gIsThreadExit 0;pthread_t threadId;if (pthread_create(threadId, nullptr, native_thread_exec, nullptr) ! 0) {LOG(native_thread_start pthread_create fail!);return;}LOG(native_thread_start success);
}extern C
JNIEXPORT void JNICALL
Java_com_my_hawk_jni2_MainActivity_nativeThreadStop(JNIEnv *env, jobject thiz) {gIsThreadExit 1;LOG(native_thread_stop success);
}其中的关键获取方法然后通过反射调用 native_thread_exec初始化的时候保存全局 JVM 和 class 对象。 env-GetJavaVM(gJavaVm);gJaveObj env-NewGlobalRef(thiz);2、总结
Android 环境中每个进程只能诞生一个 JavaVM 对象被所有线程共享。在 VM 加载 *.so 程序库时会先调用 JNI_OnLoad() 函数在 JNI_OnLoad() 函数中会将 JavaVM 指针对象保存到 C 层 JNI 的全局变量中。JNIEnv 对象和线程是一一对应的关系;Jvm 和 JNIEnv 释放问题JVM 中 Java Heap 的内存泄漏JVM 内存中 native memory 的内存泄漏从操作系统角度看JVM 在运行时和其它进程没有本质区别。在系统级别上它们具有同样的调度机制同样的内存分配方式同样的内存格局。JVM 进程空间中Java Heap 以外的内存空间称为 JVM 的 native memory。进程的很多资源都是存储在 JVM 的 native memory 中例如载入的代码映像线程的堆栈线程的管理控制块JVM 的静态数据、全局数据等等。也包括 JNI 程序中 native code 分配到的资源。 Local Reference 导致的内存泄漏
3、参考
Android开发实践JNI层线程回调Java函数示例 - 指针空间 - 博客园
JNI开发JNI层新起的函数中C回调函数中调用JAVA层的接口_tingzhushaohua的博客-CSDN博客_jni 回调函数
C通过JNI层回调java函数 - 百度文库
Android NDK开发一 - 简书
jni java 函数指针_java native interface JNI 调用Java方法_我是XiaoYang呀的博客-CSDN博客
三、JNI 数据传递
AndroidJNI调用C自定义类的详细方法_chaoqiangscu的博客-CSDN博客_jni调用c类
Java代码与Jni层之间传递数组byte[]_xiao慕r的博客-CSDN博客_jni传递数组
Android-JNI之数据类型转换_zhezi521的博客-CSDN博客_android jni 类型转换
android ndk 返回字符串,android ndk返回String(字符串)_天才娜娜ln的博客-CSDN博客
小心ReleaseByteArrayElements 中的参数问题_普通网友的博客-CSDN博客
JNIEnv*的常用函数详解
java jni 手册_Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释_发条粽子的博客-CSDN博客
NDK 开发之 Bitmap 的使用-技术圈
Android之OpenCv简单人脸识别功能Bitmap_路和远方的博客-CSDN博客_android opencv 人脸识别
JNI层向Java层传递bitmap | 码农家园
android中通过JNI读取Bitmap文件并调用opencv进行处理_一天到晚游泳的鱼啊鱼的博客-CSDN博客
JNI String类型 - 知乎
JNI 通过形参String返回数据的方法_Cosmo_Wang1989的博客-CSDN博客_jni 形参返回字符串
简介Bitmap、YUVNV21与Bitmap互转_XDK-Net的博客-CSDN博客_bitmap转nv21
bitmap 转换nv21_驱梦人的博客-CSDN博客_bitmap转nv21
JNI层向Java层传递bitmap | 码农家园
计算Java函数的签名 |
Android开发实践:JNI函数签名生成器 - 行业资讯 - 肥雀云_南京肥雀信息技术有限公司 native和static native区别_飞鸟_的博客-CSDN博客_jni static
四、JNA
JNI便捷开发框架JNA框架之入门一_cy谭的博客-CSDN博客_jna
JNI便捷开发框架JNA框架之指针参数Pointer二_cy谭的博客-CSDN博客_jna pointer
JNI便捷开发框架JNA框架之引用传递ByReference三_cy谭的博客-CSDN博客
JNI便捷开发框架JNA框架之结构参数体传递四_cy谭的博客-CSDN博客_jna 结构体传参
JNA传递二维指针数组参数给C语言_Xeon_CC的博客-CSDN博客_jna传递数组给c
JNA 技术解密_ccfeng2008的博客-CSDN博客_jna原理
jna编程学习 - 走看看
JNA 使用 回调函数 - 博麗靈夢 - 博客园
java高级用法之:JNA中的回调_flydean程序那些事的博客-CSDN博客_jna 回调函数
Jna及如何调试_nanshenjiang的博客-CSDN博客_jna测试
libffi浅析_ayu_ag的博客-CSDN博客_libffi
使用 libffi 实现 AOP_diaoju3333的博客-CSDN博客
【libffi】动态调用定义C函数_Yaso_GG的博客-CSDN博客_libffi
深入浅出JNA
android下使用JNA_10km的博客-CSDN博客_android jna
Ubuntu 12.04下制作JNA For Android_齐北的博客-CSDN博客
五、图像传递
移动端视频进阶三OpenCV的集成及视频帧转cv::Mat的相关操作_木大白易的博客-CSDN博客
Android 相机 NV21 byte[] 和 JPEG byte[] 转 OpenCV 的 Mat_weixin_33973609的博客-CSDN博客
在IOS上YUV NV21格式的CVPixelBufferRef转opencv的RGB格式cv::Mat的方法_星辰辰大海的博客-CSDN博客
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916421.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!