61阅读

c自定义头文件的例子-jni在c中的例子

发布时间:2017-08-30 所属栏目:graphics绘制到控件上

一 : jni在c中的例子

char *jbyteArrayToChar(JNIEnv *env, jbyteArraybytes)
{
char *rtn =NULL;
jsize len= env->GetArrayLength(bytes);

jbyte *arrayBody =env->GetByteArrayElements(bytes,0);
if(len>0)
{
rtn= newchar[len+1];//(char*)malloc(len+1);
memcpy(rtn,arrayBody,len);
rtn[len]=0;
}
env->ReleaseByteArrayElements(bytes,arrayBody,0);
returnrtn;
}

jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass =env->FindClass("Ljava/lang/String;");
jmethodID ctorID =env->GetMethodID(strClass,"<init>","([BLjava/lang/String;)V");
jbyteArray bytes =env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0,strlen(pat), (jbyte*)pat);
jstring encoding =env->NewStringUTF("utf-8");
return(jstring)env->NewObject(strClass, ctorID, bytes,encoding);
}

char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring =env->FindClass("java/lang/String");
jstring strencode =env->NewStringUTF("utf-8");
jmethodID mid =env->GetMethodID(clsstring, "getBytes","(Ljava/lang/String;)[B");
jbyteArray barr=(jbyteArray)env->CallObjectMethod(jstr, mid,strencode);
jsize alen =env->GetArrayLength(barr);
jbyte* ba =env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen +1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr,ba, 0);
return rtn;
}

JNIEXPORT void JNICALL Java_cn_itcast_Test_Info_1in(JNIEnv *env,jobject obj, jbyteArray buf, jint len)
{
char *CBuf=jbyteArrayToChar(env,buf);
int MyLen=len;
unsigned charuBuf[1024];
memset(uBuf,0,sizeof(uBuf));
memcpy(uBuf,CBuf,strlen(CBuf)+1);
ydt_info_in(uBuf,&MyLen);
CBuf=(char*)uBuf;
jfieldIDj_len=env->GetFieldID(env->GetObjectClass(obj),"MyLen","I");
env->SetIntField(obj,j_len,MyLen);
jfieldIDj_arr=env->GetFieldID(env->GetObjectClass(obj),"MyArr","Ljava/lang/String;");
jstringMyString=stoJstring(env,CBuf);
env->SetObjectField(obj,j_arr,MyString);
}

JNIEXPORT void JNICALL Java_cn_itcast_Test_Info_1out(JNIEnv*env, jobject obj, jstring buf, jint len)
{
char *MyBuf=jstringTostring(env,buf);
int MyLen=len;
ydt_info_out(MyBuf,&MyLen);
jfieldIDj_len=env->GetFieldID(env->GetObjectClass(obj),"MyLen","I");
env->SetIntField(obj,j_len,MyLen);
jfieldIDj_arr=env->GetFieldID(env->GetObjectClass(obj),"MyArr","Ljava/lang/String;");
jstring MyString=stoJstring(env,MyBuf);
env->SetObjectField(obj,j_arr,MyString);

}

二 : LWIP程序OPT.h头文件的各种定义

由于英文基础太差,很多东西都看不懂,所以一面对照着百度翻译,一面去查百度,lwip中opt头文件基本上是lwip的一个基础选项的设置,里面包括了很多东西,如果arp,icmp,udp,ip,tcp的协议使能和设置还有一些其他的设置,在不知情的情况下,查这个文件,会有助于你对程序设置的理解。
后面的很多中文是由百度翻译而来,所以非常不准确,欢迎批评指正。

SYS_LIGHTWEIGHT_PROT 平台锁,保护关键区域内缓存的分配与释放

NO_SYS --- 是否带操作系统, =1时带,=0时,不带

MEMCPY(dst,src,len) --- 内存拷贝 若你希望自己写拷贝函数则可替换

SMEMCPY(dst,src,len) ---内存拷贝 若你希望自己写拷贝函数则可替换

MEM_LIBC_MALLOC --- 内存函数库的使用,=1时使用c库 =0时使用自己的库

MEMP_MEM_MALLOC --- = 1时,使用mem_malloc/mem_free代替分配池

MEM_ALIGNMENT --- 字节对齐 = 1时应该是2字节对齐

MEM_SIZE --- 堆内存大小 若发送内容很多,则应设置很高

MEMP_OVERFLOW_CHECK --- 溢出保护为0时关闭,可以有1和2,2比较慢

MEMP_SANITY_CHECK --- 链检查,每次free后检查列表是否有循环

MEM_USE_POOLS --- 自定义内存池

MEM_USE_POOLS_TRY_BIGGER_POOL--- 内存池增大,增加系统可靠性

MEMP_USE_CUSTOM_POOLS --- 使用自定义内存池与lwippools.h有关

LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT --- 其他上下文释放内存

MEMP_NUM_PBUF --- RAW协议控制块数量

MEMP_NUM_UDP_PCB --- UDP协议控制块的数量

MEMP_NUM_TCP_PCB --- TCP协议控制块的数量

MEMP_NUM_TCP_PCB_LISTEN ---TCP监听连接数

MEMP_NUM_TCP_SEG --- TCP排队数量

MEMP_NUM_REASSDATA --- IP数据包排队数量

MEMP_NUM_ARP_QUEUE --- arp队列数

MEMP_NUM_IGMP_GROUP --- 组播网络接口数

MEMP_NUM_SYS_TIMEOUT --- 系统超时设置

MEMP_NUM_NETBUF --- netbuf结构数

MEMP_NUM_NETCONN --- netconn结构数

MEMP_NUM_TCPIP_MSG_API --- tcpip消息数

MEMP_NUM_TCPIP_MSG_INPKT --- tcpip数据包相关设置

PBUF_POOL_SIZE --- pbuf池大小

LWIP_ARP ---功能开启关闭

ARP_TABLE_SIZE --- ip地址缓冲对数量

ARP_QUEUEING --- arp队列

ETHARP_TRUST_IP_MAC ---arp ip mac先关

IP_FORWARD --- ip包转发

IP_OPTIONS_ALLOWED ---ip选项允许

IP_REASSEMBLY --- IP断点续传

IP_FRAG --- IP断点发送

IP_REASS_MAXAGE --- 分段数据包最大时间

IP_REASS_MAX_PBUFS --- 分段组装条数

IP_FRAG_USES_STATIC_BUF --- 使能静态缓冲区

IP_FRAG_MAX_MTU ---IP最大缓冲数量

IP_DEFAULT_TTL --- IP最大ttl时间

IP_SOF_BROADCAST --- ip sof广播

IP_SOF_BROADCAST_RECV --- spf广播过滤

LWIP_ICMP --- ICMP使能

ICMP_TTL --- ICMP最大ttl时间

LWIP_BROADCAST_PING --- 是否响应广播ping

LWIP_MULTICAST_PING --- 是否响应组播ping

LWIP_RAW ---raw协议使能

RAW_TTL --- raw ttl时间

LWIP_DHCP --- DHCP使能

DHCP_DOES_ARP_CHECK --- arp地址检查

LWIP_AUTOIP --- 自动ip使能

LWIP_DHCP_AUTOIP_COOP --- dhcp 自动ip接口

WIP_DHCP_AUTOIP_COOP_TRIES --- dhcp发现数

LWIP_SNMP --- snmp使能

SNMP_CONCURRENT_REQUESTS ---snmp并发数

SNMP_TRAP_DESTINATIONS --- snmp 陷阱相关

SNMP_PRIVATE_MIB --- snmp 私用mib

SNMP_SAFE_REQUESTS --- snmp安全相关

LWIP_IGMP --- IGMP设置

LWIP_DNS --- DNS使能

DNS_TABLE_SIZE --- dns最大记录数

DNS_MAX_NAME_LENGTH --- dns主机名最大长度

DNS_MAX_SERVERS --- 最大dns服务数

DNS_DOES_NAME_CHECK --- dns 响应校验

DNS_USES_STATIC_BUF --- dns本地缓存数

DNS_MSG_SIZE --- dns消息大小

DNS_LOCAL_HOSTLIST --- dns 主机列表

DNS_LOCAL_HOSTLIST_IS_DYNAMIC --- dns动态列表

LWIP_UDP --- udp使能

LWIP_UDPLITE --- udp数据报

UDP_TTL --- udp ttl时间

LWIP_TCP --- TCP 使能

TCP_TTL --- TCP TTL时间

TCP_WND --- TCP窗口长度

TCP_MAXRTX --- TCP最大重传次数

TCP_SYNMAXRTX --- TCP syn段最大重传次数

TCP_QUEUE_OOSEQ --- TCP队列到达顺序 应该是排序相关

TCP_MSS --- TCP最大段大小

TCP_CALCULATE_EFF_SEND_MSS --- 用于限制mms

TCP_SND_BUF --- TCP发送缓冲空间(字节)

TCP_SND_QUEUELEN ---TCP发送缓冲空间(pbufs)

TCP_SNDLOWAT --- TCP写空间(字节)

TCP_LISTEN_BACKLOG --- 启用TCP积压选择听协议控制块

TCP_DEFAULT_LISTEN_BACKLOG --- 允许最大协议控制块监听数

LWIP_TCP_TIMESTAMPS ---支持TCP时间戳选项

TCP_WND_UPDATE_THRESHOLD --- 窗口更新与触发

LWIP_EVENT_API LWIP_CALLBACK_API --- 只有一个为1 由系统控制或有回调函数控制

PBUF_LINK_HLEN --- 链路层头

PBUF_POOL_BUFSIZE --- pbuf池大小

LWIP_NETIF_HOSTNAME --- 使用dhcp_option_hostname用netif的主机名

lwip_netif_api --- 是否支持netif API,1为支持

LWIP_NETIF_STATUS_CALLBACK --- 回调函数支持接口

lwip_netif_link_callback --- 链路故障相关

lwip_netif_hwaddrhint --- 缓存链路层地址的提示

lwip_netif_loopback --- 支持发送数据包的目的地IP

lwip_loopback_max_pbufs --- 在队列的最大数量的pbufs回送

LWIP_NETIF_LOOPBACK_MULTITHREADING --- 是否启用多线程

LWIP_NETIF_TX_SINGLE_PBUF --- 单一Pbuf发送

LWIP_HAVE_LOOPIF --- 支持回送地址(127.0.0.1) and loopif.c

LWIP_HAVE_SLIPIF --- 支持滑动界面和slipif C

TCPIP_THREAD_NAME --- 分配给主要的TCPIP线程的名称

扩展:lwip opt.h / stm32 lwip宏定义 / lwip udp client程序

tcpip_thread_stacksize --- 由主线程使用TCPIP栈大小

TCPIP_THREAD_PRIO --- 分配给主要的TCPIP线程优先级

tcpip_mbox_size --- 用于tcpip线程消息邮箱大小

SLIPIF_THREAD_NAME --- SLIPIF 线程名

SLIPIF_THREAD_STACKSIZE --- 分配给slipif_loop线程优先级

PPP_THREAD_NAME --- PPP协议线程名称

PPP_THREAD_STACKSIZE --- 由pppmain线程使用的堆栈大小

ppp_thread_prio --- 分配给pppmain线程优先级

DEFAULT_THREAD_NAME --- 默认LWIP线程名

DEFAULT_THREAD_STACKSIZE --- 缺省堆栈大小

default_thread_prio --- 分配给任何其他LwIP线程优先级

default_raw_recvmbox_size --- 其他raw邮箱大小

DEFAULT_UDP_RECVMBOX_SIZE --- 其他udp邮箱大小

DEFAULT_TCP_RECVMBOX_SIZE --- 其他tcp邮箱大小

DEFAULT_ACCEPTMBOX_SIZE --- ACCEPTMBOX大小

lwip_tcpip_core_locking --- (实验!)平时不用

lwip_netconn --- 使能netconn API(需要使用api_lib。C)

lwip_socket --- 使Socket API (需要sockets.c)

lwip_compat_sockets --- BSD套接字函数名称

lwip_posix_sockets_io_names ---使POSIX风格的套接字函数名称posix系统

LWIP_TCP_KEEPALIVE --- 死链检测

LWIP_SO_RCVBUF ---使能阻塞处理程序

RECV_BUFSIZE_DEFAULT --- 若使能阻塞处理,则该设置为阻塞缓冲大小

SO_REUSE --- 重发送

lwip_stats --- 使能lwip_stats统计

LWIP_STATS_DISPLAY --- 编译输出统计功能

LINK_STATS --- 使能连接统计

ETHARP_STATS --- 使能arp统计

IP_STATS --- 使能ip统计

IPFRAG_STATS --- ip碎片统计

ICMP_STATS --- icmp统计

IGMP_STATS ---igmp统计

UDP_STATS --- udp统计

TCP_STATS --- tcp统计

MEM_STATS ---内存管理统计

MEMP_STATS --- 内存链表统计

SYS_STATS --- 系统统计

PPP_SUPPORT --- 使能ppp协议

PPPOE_SUPPORT --- 使能pppoe协议

PPPOS_SUPPORT --- 使能pppos协议

NUM_PPP --- 最大ppp会话

PAP_SUPPORT --- 使能pap密码认证协议

CHAP_SUPPORT--- 使能chap协议

MSCHAP_SUPPORT --- 使能mschap目前不支持,不设置

CBCP_SUPPORT --- 使能CBCP 目前不支持,不设置

CCP_SUPPORT --- 使能ccp 目前不支持,不设置

VJ_SUPPORT --- 使能 支持该报头压缩

md5_support --- 支持MD5

FSM_DEFTIMEOUT --- 贞退出时间

FSM_DEFMAXTERMREQS --- 最大终止请求传输

FSM_DEFMAXCONFREQS --- 最大配置请求传输

FSM_DEFMAXNAKLOOPS --- NAK环的最大数量

UPAP_DEFTIMEOUT --- 重发请求超时(秒)

UPAP_DEFREQTIME --- 时间等待认证请求同行

CHAP_DEFTIMEOUT --- chap默认退出时间

CHAP_DEFTRANSMITS --- 竞争最大发送时间

LCP_ECHOINTERVAL --- KeepAlive回送请求之间间隔,0秒为禁用

LCP_MAXECHOFAILS --- 故障之前悬而未决的回声请求数

PPP_MAXIDLEFLAG --- 最大发射空闲时间(在经过前发送标志字符)

CHECKSUM_GEN_IP --- 生成ip包校验

CHECKSUM_GEN_UDP --- 生成udp包校验

CHECKSUM_GEN_TCP --- 生成tcp包校验

CHECKSUM_CHECK_IP ---传入ip包校验

CHECKSUM_CHECK_UDP ---传入udp包校验

CHECKSUM_CHECK_TCP --- 传入tcp包校验

以下是各种调试

LWIP_DBG_MIN_LEVEL

LWIP_DBG_TYPES_ON

ETHARP_DEBUG

NETIF_DEBUG

PBUF_DEBUG

API_LIB_DEBUG

API_MSG_DEBUG

SOCKETS_DEBUG

ICMP_DEBUG

IGMP_DEBUG

INET_DEBUG

IP_DEBUG

IP_REASS_DEBUG

RAW_DEBUG

MEM_DEBUG

MEMP_DEBUG

SYS_DEBUG

TCP_DEBUG

TCP_INPUT_DEBUG

TCP_FR_DEBUG

TCP_RTO_DEBUG

TCP_CWND_DEBUG

TCP_WND_DEBUG

TCP_OUTPUT_DEBUG

TCP_RST_DEBUG

TCP_QLEN_DEBUG

UDP_DEBUG

TCPIP_DEBUG

PPP_DEBUG

SLIP_DEBUG

DHCP_DEBUG

AUTOIP_DEBUG

SNMP_MSG_DEBUG

SNMP_MIB_DEBUG

DNS_DEBUG

扩展:lwip opt.h / stm32 lwip宏定义 / lwip udp client程序

三 : C# GDI 绘制自定义控件

今天用GDI+绘制一个渐变的Panel,窗体移到有的被遮盖处,比如说开始菜单以下,再移上来,就出现如图

情形。有的时候又很正常。

后来终于发现问题出在OnPaint方法里,使用渐变笔刷时是这样调用的

[c-sharp] view plaincopy?

protectedoverridevoidOnPaint(PaintEventArgse)

{

base.OnPaint(e);

LinearGradientBrushbrush=newLinearGradientBrush(e.ClipRectangle,upperColor,downColor,LinearGradientMode.Vertical);

e.Graphics.FillRectangle(brush,e.ClipRectangle);

}

当时还沾沾自喜来着,直接用了e.ClipRectangle不用自己定义Rectangle。

后来发现e.ClipRectangle指需要绘制的部分。那么,当控件被遮住不需要绘制时,e.ClipRectangle的大小自然就变化了,因此出现上述现象。因此,还是得乖乖的指定需绘制的大小。

另附上自定义渐变Panel的代码,如下。

[c-sharp] view plaincopy?

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Drawing;

usingSystem.Data;

usingSystem.Text;

usingSystem.Windows.Forms;

usingSystem.Drawing.Drawing2D;

namespaceMyControls

{

publicpartialclassMyGradientPanel:Panel

{

publicMyGradientPanel()

{

InitializeComponent();

this.SetStyle(ControlStyles.UserPaint,true);

this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);

this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);

//Redrawwhenresized

this.SetStyle(ControlStyles.ResizeRedraw,true);

this.Font=SystemInformation.MenuFont;

}

privateColorupperColor=Color.LawnGreen;

publicColorUpperColor

{

get{returnupperColor;}

set{upperColor=value;this.Invalidate();}

}

privateColordownColor=Color.LemonChiffon;

publicColorDownColor

{

get{returndownColor;}

set{downColor=value;this.Invalidate();}

}

protectedoverridevoidOnPaint(PaintEventArgse)

{

base.OnPaint(e);

RectanglebaseRectangle=newRectangle(0,0,this.Width,this.Height);

using(BrushgradientBrush=newLinearGradientBrush(baseRectangle,upperColor,downColor,LinearGradientMode.Vertical))

{

e.Graphics.FillRectangle(gradientBrush,baseRectangle);

}

}

protectedoverridevoidOnResize(EventArgse)

{

base.OnResize(e);

Invalidate();

}

}

}

四 : 自定义word2007文档中最近使用的文件列表

Microsoft Office程序都会显示最近在该程序中打开的几个文件。您可以使用此列表上的链接快速访问这些文件。此功能默认情况下处于打开状态,由于涉及隐私,您可以将其关闭,也可以重新打开或调整它所显示的文件的数量。如果将其关闭,则打开文件时必须使用“打开”对话框通过浏览找到该文件,才能打开文档。如果关闭此功能,然后重新打开它,将只列出您在打开此功能后打开和保存的文件。请按照以下方法自定义最近使用的文件列表:

  点击word2007文档左上角的“MS Office”按钮,然后点击“Word选项”,点击左侧的“高级”切换到“高级”选项卡,在“显示”下的“显示此数目的‘最近使用的文档’”列表中,单击要显示的文件数。如果不希望显示任何文件,请单击“0”。

  提示:

  要将文件保留在“最近使用的文档”列表中,请单击文档左上角的“MS Office”按钮 ,然后单击右侧“最近使用的文档”下该文档名称的右侧的“将此文档固定到‘最近使用的文档’列表”按钮(即针状的按钮) 。将文档固定到“最近使用的文档”列表中后,固定按钮将显示为一个图钉俯视图。

五 : WordPress 技巧:自定义上传路径和生成文件的 URL 地址

WordPress 3.5 一个最大的改变就是更加简洁化,把一些用户不常使用的设置去掉或者隐藏了,比如后台的媒体(Media)设置页面隐藏上传路径(upload_path)和文件 URL 地址(upload_url_path)的设定就被隐藏了。如果你还要进行设置这两个选项,现在只能在options.php中进行设置,或者使用 UPLOADS 常量,也可以使用 upload_dir 这个 filter。下面分别介绍下这三种方法:

1.  中设置

直接访问:http://site_url/wp-admin/options.php,然后找到下面选项,将其设置为你所需的参数。

options.php 中设置

2. 定义 UPLOADS 常量

在  文件中定义 UPLOADS 这个常量:

WordPress 3.5 一个最大的改变就是更加简洁化,把一些用户不常使用的设置去掉或者隐藏了,比如后台的媒体(Media)设置页面隐藏上传路径(upload_path)和文件 URL 地址(upload_url_path)的设定就被隐藏了。如果你还要进行设置这两个选项,现在只能在options.php中进行设置,或者使用 UPLOADS 常量,也可以使用 upload_dir 这个 filter。

define(‘UPLOADS’,‘my-uploads’);

这个方法有个不好的地方:只能指定上传的相对目录,生成文件的 URL 地址不能使用子域名,这样在做静态文件 CDN 加速的时候就不是很方便。

3. 使用  filter

这个方法,效果其实和第一个方法基本一致:

add_filter( ‘upload_dir’, ‘wpjam_custom_upload_dir’ );

function wpjam_custom_upload_dir( $uploads ) {

$upload_path = ‘’;

$upload_url_path = ‘’;

if ( empty( $upload_path ) || ‘wp-content/uploads’ == $upload_path ) {

$uploads[‘basedir’] = WP_CONTENT_DIR 。 ‘/uploads’;

} elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) {

$uploads[‘basedir’] = path_join( ABSPATH, $upload_path );

} else {

$uploads[‘basedir’] = $upload_path;

}

$uploads[‘path’] = $uploads[‘basedir’].$uploads[‘subdir’];

if ( $upload_url_path ) {

$uploads[‘baseurl’] = $upload_url_path;

$uploads[‘url’] = $uploads[‘baseurl’].$uploads[‘subdir’];

}

return $uploads;

}

将上面代码中的$upload_path  和$upload_url_path改成你要的值,然后上传到当前主题的fucntions.php文件即可。

另外这三种方法的优先级是:使用upload_dir filter> 定义 UPLOADS 常量 >options.php 中设置

文章来源:我爱水煮鱼

本文标题:c自定义头文件的例子-jni在c中的例子
本文地址: http://www.61k.com/1059464.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1