05 子线程findclass

Android 系统低内存lowmemorykiller关于阈值修改 minfreeAbsKbytes优化 在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,minfreeAbsKbytes优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现 阅读详情

JNI子线程FindClass失败

 

1、在C语言里创建子线程

 

 在进行jni开发时,Java调用C语言一般都处于主线程中的,但是使用JNI开发,很多情况都是需要开启子线程的(毕竟不能阻塞主线程),那么如何开启子线程尼?很简单,代码如下:

 

void void *th_fun(void *arg) {} //是子线程的回调函数

pthread_create(&tid, NULL/*很少用到*/, th_fun/*子线程回调*/, (void *) "no1"/*传递给子线程的参数*/);

 

 

2、在子线程使用env

 

 有时候在子线程会去调用Java方法,那么如何调用尼?一般我们都会通过env->FIndClass来调用,但是如何在子线程回调函数里拿到env尼?将env设为全局引用,这是一个解决方案,但是env本就是与线程相关的,如果设为全局引用给其他线程调用,这样就搞混乱了,所以不好。那么如何解决尼?其实我们可以通过JavaVM来解决,JavaVM代表的是Java虚拟机,所有工作都是从JavaVM开始的,每个Java程序代表一个JavaVM,Android里每个Android程序都的JavaVM都是一样的。解决方案如下:

 

static JavaVM *javaVM;

 

//动态库加载时会执行

//兼容Android SDK 2.2之后,2.2没有这个函数

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {

LOGI("%s", "JNI_OnLoad");

javaVM = vm;

return JNI_VERSION_1_4;

}

void *th_fun(void *arg) {

JNIEnv *env = NULL;

int isAttacked = 0;

int status = (*javaVM)->GetEnv(javaVM, (void **) &env, JNI_VERSION_1_4);

if (status < 0) {

isAttacked = 1;

(*javaVM)->AttachCurrentThread(javaVM, &env, NULL);

}

}

 

3、在子线程FindClass失败

 

 有时候会在子线程去调用Java类,但是在我们创建的子线程(通过pthread_create创建)中调用FindClass查找非系统类时会失败(查找系统类不会失败),返回值为NULL,为什么尼?这是因为通过AttachCurrentThread附加到虚拟机的线程在查找类时只会通过系统类加载器进行查找,不会通过应用类加载器进行查找,因此可以加载系统类,但是不能加载非系统类,如自己在java层定义的类会返回NULL。

 那么如何解决尼?主要有以下两个方案

 

获取classLoader,通过调用classLoader的loadClass来加载自定义类。适合自定义类比较多的情况

在主线程创建一个全局的自定义类引用。适合自定义类比较少的情况

#include <jni.h>

#include <pthread.h>

#include <android/log.h>

#include <stdio.h>

#include <unistd.h>

 

#define LOGI(FORMAT, ...) __android_log_print(ANDROID_LOG_INFO,"dadou",FORMAT,##__VA_ARGS__);

#define LOGE(FORMAT, ...) __android_log_print(ANDROID_LOG_ERROR,"dadou",FORMAT,##__VA_ARGS__);

 

 

static JavaVM *javaVM;

static jobject class_loader_obj_ = NULL;

static jmethodID find_class_mid_ = NULL;

static jclass global_ref = NULL;

 

//动态库加载时会执行

//兼容Android SDK 2.2之后,2.2没有这个函数

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {

LOGI("%s", "JNI_OnLoad");

javaVM = vm;

LOGI("a=%d,b=%d", vm == NULL, javaVM == NULL);

//--------------------------------------------方案一--------------------------------------------

// JNIEnv *env = NULL;

// int status = (*javaVM)->GetEnv(javaVM, (void **) &env, JNI_VERSION_1_4);

// if (status == JNI_OK) {//我认为最好在JNI_OnLoad里拿到classLoader的全局引用

// jclass classLoaderClass = (*env)->FindClass(env, "java/lang/ClassLoader");

// jclass adapterClass = (*env)->FindClass(env, "com/example/thread/UUIDUtils");

// if (adapterClass) {

// jmethodID getClassLoader = (*env)->GetStaticMethodID(env, adapterClass,

// "getClassLoader",

// "()Ljava/lang/ClassLoader;");

// jobject obj = (*env)->CallStaticObjectMethod(env, adapterClass, getClassLoader);

// class_loader_obj_ = (*env)->NewGlobalRef(env, obj);

// find_class_mid_ = (*env)->GetMethodID(env, classLoaderClass, "loadClass",

// "(Ljava/lang/String;)Ljava/lang/Class;");

// (*env)->DeleteLocalRef(env, classLoaderClass);

// (*env)->DeleteLocalRef(env, adapterClass);

// (*env)->DeleteLocalRef(env, obj);

// }

// }

//----------------------------------------------------------------------------------------------

return JNI_VERSION_1_4;

}

 

//子线程的回调

/**

* 在子线程中,不能通过env->FindClass来获取自定义类,(*env)->FindClass(env, "com/example/thread/UUIDUtils");返回NULL,

* (*env)->FindClass(env,"java/lang/String");能够正确的返回

* 解决方案一:获取classLoader,通过调用classLoader的loadClass来加载自定义类。适合自定义类比较多的情况

* 解决方案二:在主线程创建一个全局的自定义类引用。适合自定义类比较少的情况

* @param arg

* @return

*/

void *th_fun(void *arg) {

JNIEnv *env = NULL;

int isAttacked = 0;

int status = (*javaVM)->GetEnv(javaVM, (void **) &env, JNI_VERSION_1_4);

if (status < 0) {

isAttacked = 1;

(*javaVM)->AttachCurrentThread(javaVM, &env, NULL);

}

jclass clazz = NULL;

//--------------------------------------------方案一--------------------------------------------

// jstring class_name = (*env)->NewStringUTF(env, "com/example/thread/UUIDUtils");

// clazz = (*env)->CallObjectMethod(env, class_loader_obj_, find_class_mid_,

// class_name);

// (*env)->DeleteLocalRef(env, class_name);

// if (clazz != NULL) {

// jmethodID get_mid = (*env)->GetStaticMethodID(env, clazz, "get",

// "()Ljava/lang/String;");

// jobject uuid = (*env)->CallStaticObjectMethod(env, clazz, get_mid);

// char *uuid_cstr = (char *) (*env)->GetStringUTFChars(env, uuid, NULL);

// LOGI("uuid : %s", uuid_cstr);

// (*env)->ReleaseStringUTFChars(env, uuid, uuid_cstr);

// }

//----------------------------------------------------------------------------------------------

//--------------------------------------------方案二--------------------------------------------

if (global_ref != NULL) {

jmethodID get_mid = (*env)->GetStaticMethodID(env, global_ref, "get",

"()Ljava/lang/String;");

jobject uuid = (*env)->CallStaticObjectMethod(env, global_ref, get_mid);

char *uuid_cstr = (char *) (*env)->GetStringUTFChars(env, uuid, NULL);

LOGI("uuid : %s", uuid_cstr);

(*env)->ReleaseStringUTFChars(env, uuid, uuid_cstr);

}

//----------------------------------------------------------------------------------------------

 

char *no = (char *) arg;

int i = 0;

for (i = 0; i < 5; i++) {

LOGI("thread %s, i:%d", no, i);

if (i == 4) {

if (class_loader_obj_ != NULL) {

(*env)->DeleteGlobalRef(env, class_loader_obj_);

}

//采用方案二时需要释放全局引用

//---------------释放---------

if (global_ref != NULL) {

LOGI("%s", "开始释放全局引用")

(*env)->DeleteGlobalRef(env, global_ref);

}

//----------------------------

 

//下面的函数必须最后执行,在后面再使用env会报错

if (isAttacked == 1) {

//解除关联

(*javaVM)->DetachCurrentThread(javaVM);//必须在离开当前线程之前执行

}

pthread_exit((void *) 0);

}

sleep(1);

}

 

}

 

 

//JavaVM 代表的是Java虚拟机,所有工作都是从JavaVM开始的,每个Java程序代表一个JavaVM,Android里每个Android程序都的JavaVM都是一样的

//可以通过JavaVM获取到每个线程关联的JNIEnv

 

 

//如何获取JavaVM?

//1.在JNI_OnLoad函数中获取

//2.(*env)->GetJavaVM(env,&javaVM);

//每个线程都有独立的JNIEnv

JNIEXPORT jstring JNICALL Java_com_example_thread_MainActivity_stringFromJNI(

JNIEnv *env, jobject /* this */ object) {

char str[] = "Hello from C";

jclass clazz = (*env)->FindClass(env, "com/example/thread/UUIDUtils");

global_ref = (*env)->NewGlobalRef(env, clazz);

pthread_t tid;//子线程id

//创建一个子线程

pthread_create(&tid, NULL/*很少用到*/, th_fun/*子线程回调*/, (void *) "no1"/*传递给子线程的参数*/);

return (*env)->NewStringUTF(env, str);

}

 

 

 下面就是Java方法

 

public class UUIDUtils {

public static ClassLoader getClassLoader() {

return UUIDUtils.class.getClassLoader();

}

public static String get(){

return UUID.randomUUID().toString();

}

}

 

原文:https://blog.youkuaiyun.com/lmh_19941113/article/details/85048184

 

中小企业办公网络配置综合实验华为设备(NAT+策略路由+OSPF+VLAN) 组网需求: 1、PC1、2、3、4均可以访问internet的lo0:8.8.8.8 2、PC1、PC4通过电信ISP访问internet;PC2、PC3通过联通ISP访问internet; 需求分析: 1、internet路由器模拟公网,8.8.8.8模拟公网IP;电信ISP、联通ISP路由器模拟电信和联通运营商;出口路由为企业出口路由器;这四个路由器直连链路之间运行ospf,配置动态路由,实现互通; 2、出口路由与三层交换直连链路运行ospf,动态同步路由信息; 3、出口路由器内网端口配.. 阅读详情

相关推荐

hcaptcha无感验证码逆向实战:从接口分析到环境补全

本文详细解析了hcaptcha无感验证码的逆向实战过程。通过分析核心接口与加密逻辑,重点介绍了采用环境补全策略来模拟真实浏览器环境,从而绕过验证码检测。文章提供了从接口抓包、剖析hsw.js加密核心到使用Node.js搭建模拟环境的完整步骤,为自动化操作提供了一种稳健的解决方案。

weixin_29324401的博客 1152

JNI子线程FindClass失败

1、在C语言里创建子线程  在进行jni开发时,Java调用C语言一般都处于主线程中的,但是使用JNI开发,很多情况都是需要开启子线程的(毕竟不能阻塞主线程),那么如何开启子线程尼?很简单,代码如下: void void *th_fun(void *arg) {}//是子线程的回调函数,我认为就相当于Java里的`Runnable`任务,但是在C语言里是可以传递参数的。 pthread_creat...

大逗的博客 5223

国税局发票查验中英文验证码识别,识别率95.2%

国税验证码识别方法介绍

onedayismyway的博客 3135

jni子线程获取FindClass自定义类返回NULL

问题描述: 在jni中通过FindClass函数获取自定义java类,返回为NULL,获取失败。 问题分析: jni默认使用系统类加载器,不是应用类加载器。 解决方案: 1、获取应用类加载器去加载自定义类; 2、定义全局变量,并生成全局引用; ...

wquasdf的博客 3041

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考

本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。

long0_o的博客 3310

CST周期边界仿真:揭秘频率选择表面(FSS)单元设计全流程

本文详细解析了CST周期边界仿真在频率选择表面(FSS)单元设计中的应用全流程。从理论基础到工程实践,涵盖了求解器选择、几何建模、边界设置、端口优化等关键步骤,并提供了常见问题排查指南。通过CST仿真技术,工程师能够高效预测FSS的电磁特性,为实际应用提供可靠的设计依据。

weixin_30571465的博客 358

安卓android jni创建线程后无法findclass

参考: http://blog.youkuaiyun.com/qiuchangyong/article/details/27222701 http://blog.youkuaiyun.com/lirunfa/article/details/8030094 C++里首先定义全局变量: JavaVM* gs_jvm = nullptr; 然后在第一个java调用c++的函数里调用

brook0344的专栏 3337

OpenCV实战:高效检测与识别多类型条码与二维码

本文详细介绍了如何利用OpenCV的BarcodeDetector和QRCodeDetector模块,高效实现EAN-13条形码与常见二维码的检测与识别。内容涵盖从环境搭建、单码识别到处理多二维码的完整流程,并分享了提升识别率的图像预处理与性能优化等实战技巧,帮助开发者一站式解决视觉项目中的条码识别需求。

weixin_29094539的博客 493

env->FindClass() ClassNotFound

上面的if (method!= nullptr) { 判断是否有Java堆栈帧,没有的话就走到下面的GetSystemClassLoader得到系统的类加载器,因此就找不到app中的类,当我们使用从c++层的线程去执行FindClass的时候会遇到上述问题,大家可以参考上面的解决方案尝试解决。在JNI调用的时候如果遇到了异常,不会立即抛出异常,当代码执行到受管理的代码时会抛出异常。什么是受管理的代码:使用 Java 或 Kotlin 编程语言编写的代码。为什么FindClass会走到系统类加载器呢?

liu_12345_liu的博客 1717

【Python办公】剪贴板记录工具(记录文本 + 图片防重复)

本文介绍了一个用Python开发的剪贴板记录工具,能够自动记录复制过的文本和图片内容。该工具使用tkinter构建GUI界面,通过后台线程实时监控剪贴板变化,具有文本记录、图片保存(自动去重)功能。核心代码采用pyperclip访问剪贴板,PIL处理图片,hashlib计算图片哈希值实现去重。运行程序后,文本内容直接显示在界面,图片保存为PNG文件并记录路径。工具还提供清空历史记录功能,适合日常办公中需要追踪剪贴板历史的使用场景。

weixin_42636075的博客 240

Objective-C实现人工势场法(附完整源码)

Objective-C实现人工势场法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 426

env->FindClass()为NULL的一种解决办法

  用C加载虚拟机,FindClass()一直为NULL。这找不到还怎么玩啊。于是上网搜索,试了各种办法并没成功。   FindClass()的类名字串,分隔符应该是/,这个不多说。   后来看到别人的代码写法跟自己不一样,于是改了一下,正确了。原因也明白了。 错误 char buffer[128] = {0}; sprintf(buffer, "-Djava.class.path=%s...

柳鲲鹏 5027

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1195

Android Jni Native线程回调Java函数,env->findClass()失败。

Android Jni Native线程回调Java函数,env->findClass()失败。

lsg_lsg_lsg的博客 1470

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JNI笔记3,解决findClass()调用失败的问题

JNI笔记3,解决findClass()调用失败的问题 以上一篇转载的为例,做具体分析,并且代码调试通过,上一篇转载的文章因转载人数过多,其实代码是跑不起来的。 00 背景 在JNI的调用中,总是要涉及到Native层调用Java层的情况,最近遇到的问题就是,Native层本地多线程回调Java函数时env->findClass()失败,单线程调用的时候会成功,多线程调用的时候存在返回N...

老衲不出家 3602

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JNI中FindClass失败问题

由于最近需要写一些jni代码,当然也踩了一些坑,现在梳理一下;写jni访问java层时如果FindClass失败,轻则会导致访问java层的方法失败,处理不当时会导致native层崩溃。 究其原因一般由两种: 原因一: java类名称字符串的格式错误导致,需要注意以下几点: 1、JNI 类名称以软件包名称开头,并用斜线分隔,例如 java/lang/String。 2、果您要查找某个数组类,则需要...

jping_share 4996

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

从Android JNI的任何线程中找到FindClass

Android的JNI tips页面提到了这个常见问题:为什么FindClass找不到我的类?他们提到了多种解决方案,最后一个选项是:So, I tried to get it working and it seems that no matter what, this method simply does not work for me. Eventually, I figured how to use ClassLoader but it won't work if from a native thre

cqn2bd2b的博客 939

JNI 多线程 env->FindClass失败

在主线程中,使用env->FindClass执行正常,可以正常调用。但是在多线程的情况下,其他线程去使用自己的env下的FindClass会失败。 问题是其他线程的env找不到相关类。 解决方案: 添加链接描述 //在工作线程内 JNIEnv *env; jclass cls; jmethodID mid; //Attach主线程 if(AndroidHelper::getInstance()->GetVM()->AttachCurrentThread(&

weixin_38622593的博客 1892

JNI中FindClass查找类失败的问题

例如有如下的native代码用来寻找类,然后注册接口函数: static const char *classPathName = "android/device/PiccReaderNative/PiccReaderNative"; static int registerNatives(JNIEnv* env) { jclass clazz; clazz = env->FindClass(classPathName); if (clazz == NULL) {

oushaojun2的专栏 2091

java findclass,FindClass 找不到类解决方法

FindClass 找不到类c++调用java编译环境linuxUbuntu13.10JDK信息root@master:/usr/java#echo$JAVA_HOME/usr/java/jdk1.7.0_65root@master:/usr/java#echo$CLASSPATH.:/usr/java/jdk1.7.0_65/lib:/usr/java/jdk1.7.0...

weixin_39981681的博客 828

java getmethodid_Android上的FindClass和GetMethodID失败jni

我有用于我的应用程序的C++ lib。我将java对象传递给jni并将其保存到全局引用。然后,我想从antoher线程(我使用pthread)从jni调用此java对象的方法。Android上的FindClass和GetMethodID失败jniJava类是:public class WaitingServiceReadyCallback {public void ready(String ser...

weixin_42515561的博客 682

NDK学习笔记-JNI多线程

前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实现中,直接调用pthread的多线程方法,这样就可以在JNI层实现多线程,下面是一个简单的实现多线程的例子 #include <stdlib.h> #include <unistd....

cj5785 2709

JNI 子线程FindClass

FindClass之前要先     status = (*g_JavaVM)->AttachCurrentThread(g_JavaVM,&env, NULL);

God_create_the_coder的专栏 1092

UUIDUtils订单号工具类

package com.jsy.basic.util.utils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; public class UUIDUtils { public static String getUUID() { String uuid = UUID.ra

鱼皮小刘博客 452

JNI FindClass 遇到的 NoClassDefFoundError 错误

虽然解决了 boot classLoader 加载应用类的问题,但还有一个问题需要解决,那就是调用 Java 方法之后可能会造成的循环调用问题,这里需要做一些类、方法的排除。jvmti demo 示例可查看 jvmticheck.cpp[4]

chuyouyinghe的专栏 705

C++ 线程-类方式

C++ 线程-类方式

代码人生 501
上一篇: 04 jni调用java方法
下一篇: 06 jni编译与调用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值