C++代码改成java代码转成python代码怎么改呀

openoffice中一个将java代码转换为c++代码的例子
java代码如下:
//Listing 33 A
Code Example
// create new writer document and get text, then manipulate text
XComponent xWriterComponent = newDocComponent(&swriter&);
XTextDocument xTextDocument = (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class,xWriterComponent);
// Access the text document&s multi service factory, which we will need for most of the
// following examples
mxDocFactory = (XMultiServiceFactory) UnoRuntime.queryInterface
(XMultiServiceFactory.class,xTextDocument);
XText xText = xTextDocument.getText();
// create a text cursor from the cells XText interface
XTextCursor xTextCursor = xText.createTextCursor();
// Get the property set of the cell&s TextCursor
XPropertySet xTextCursorProps = (XPropertySet)UnoRuntime.queryInterface
(XPropertySet.class,xTextCursor);
// Page Style name
String pageStyleName= xTextCursorProps.getPropertyValue(&PageStyleName&).toString();
// Get the StyleFamiliesSupplier interface of the document
XStyleFamiliesSupplier xSupplier = (XStyleFamiliesSupplier) UnoRuntime.queryInterface
(XStyleFamiliesSupplier.class,xTextDocument);
// Use the StyleFamiliesSupplier interface to get the XNameAccess interface of the
// actual style families
XNameAccess xFamilies = (XNameAccess)UnoRuntime.queryInterface(XNameAccess.class,
xSupplier.getStyleFamilies());
// Access the &PageStyles& Family
XNameContainer xFamily = (XNameContainer) UnoRuntime.queryInterface
(XNameContainer.class,xFamilies.getByName(&PageStyles&));
// Insert the newly created style into the PageStyles family
XStyle xStyle= (XStyle) UnoRuntime.queryInterface(XStyle.class,xFamily.getByName
(pageStyleName));
// Get the property set of the TextCursor
XPropertySet xStyleProps = (XPropertySet)UnoRuntime.queryInterface
(XPropertySet.class,xStyle);
xStyleProps.setPropertyValue(&LeftMargin&,new Short((short)1200));
xStyleProps.setPropertyValue(&RightMargin&,new Short((short)1200));
xStyleProps.setPropertyValue(&BottomMargin&,new Short((short)1200));
c++代码如下:
//Listing 34 The corresponding C++ Translation
// create new writer document and get text, then manipulate text
// Don&t forget to add : using namespace com::sun::star::
// Don&t forget to add : #include
// Don&t forget to add &com.sun.star.text.XTextDocument \& in the makefile
// Don&t forget to add : using namespace com::sun::star::
// Don&t forget to add : #include
// Don&t forget to add &com.sun.star.beans.XPropertySet \& in the makefile
// Don&t forget to add : using namespace com::sun::star::
// Don&t forget to add : #include
// Don&t forget to add &com.sun.star.style.XStyleFamiliesSupplier \& in the makefile
// Don&t forget to add : using namespace com::sun::star::
// Don&t forget to add : #include
// Don&t forget to add &com.sun.star.container.XNameContainer \& in the makefile
// Don&t forget to add : #include
// Don&t forget to add &com.sun.star.style.XStyle \& in the makefile
// the first line cannot be translated : already done in our main()
// XComponent xWriterComponent = newDocComponent(&swriter&);
Reference & XTextDocument & xTextDocument (xWriterComponent,UNO_QUERY);
// Access the text document&s multi service factory, which we will need for most of the
// following examples
Reference& XMultiServiceFactory & mxDocFactory(xTextDocument,UNO_QUERY);
Reference& XText & xText = xTextDocument-&getText();
// create a text cursor from the cells XText interface
Reference& XTextCursor & xTextCursor = xText-&createTextCursor();
// Get the property set of the cell&s TextCursor
Reference& XPropertySet & xTextCursorProps(xTextCursor,UNO_QUERY);
// Page Style name
//*** I add a intermediate variable because of Any type returned by getPropertyValue
Any pageStyleName2 = xTextCursorProps-&getPropertyValue
(OUString::createFromAscii(&PageStyleName&));
OUString pageStyleN
pageStyleName2 &&= pageStyleN
// Get the StyleFamiliesSupplier interface of the document
Reference& XStyleFamiliesSupplier & xSupplier(xTextDocument,UNO_QUERY);
// Use the StyleFamiliesSupplier interface to get the XNameAccess interface of the
// actual style families
Reference& XNameAccess & xFamilies(xSupplier-&getStyleFamilies(),UNO_QUERY);
// Access the &PageStyles& Family
Reference& XNameContainer & xFamily(xFamilies-&getByName
(OUString::createFromAscii(&PageStyles&)),UNO_QUERY);
// Insert the newly created style into the PageStyles family
Reference& XStyle & xStyle(xFamily-&getByName(pageStyleName),UNO_QUERY);
// Get the property set of the TextCursor
Reference& XPropertySet & xStyleProps(xStyle,UNO_QUERY);
Any lm, rm,
lm&&=(short)1200; rm&&=(short)1200; bm&&=(short)1200;
xStyleProps-&setPropertyValue(OUString::createFromAscii(&LeftMargin&),lm);
xStyleProps-&setPropertyValue(OUString::createFromAscii(&RightMargin&),rm);
xStyleProps-&setPropertyValue(OUString::createFromAscii(&BottomMargin&),bm);
因为对any类型的理解不深入,我不知道如何直接使用any变量,所以我用了三个临时any变量,见最后三行第八节(c\c++调用java代码) - 简书
第八节(c\c++调用java代码)
先看个命令:javap(获取方法的签名,其实不用这个命令也行,自己应该也看的出来方法的签名,只是介绍个工具)
javap命令操作的是class文件
调用java非静态方法
以这段代码为例:
package com.example.huozhenpeng.
import android.support.v7.app.AppCompatA
import android.os.B
import android.widget.TextV
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
System.loadLibrary("native-lib");
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText("");
public String getJavaMethod(int max)
return "helloworld";
hhh:myapplication huozhenpeng$ javap -s -p MainActivity.class
Compiled from "MainActivity.java"
public class com.example.huozhenpeng.myapplication.MainActivity extends android.support.v7.app.AppCompatActivity {
public com.example.huozhenpeng.myapplication.MainActivity();
descriptor: ()V
protected void onCreate(android.os.Bundle);
descriptor: (Landroid/os/B)V
public java.lang.String getJavaMethod(int);
descriptor: (I)Ljava/lang/S
static {};
descriptor: ()V
package com.example.huozhenpeng.
import android.support.v7.app.AppCompatA
import android.os.B
import android.widget.TextV
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
System.loadLibrary("native-lib");
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getJavaMethod();
public native void getJavaMethod();
public String addMethod(int max)
return max+"helloworld";
extern "C"
JNIEXPORT void JNICALL
Java_com_example_huozhenpeng_myapplication_MainActivity_getJavaMethod(JNIEnv *env,
jobject instance) {
jcs=env-&GetObjectClass(instance);
jmd=env-&GetMethodID(jcs,"addMethod","(I)Ljava/lang/S");//L表示的是对象类型
job=env-&CallObjectMethod(instance,jmd,200);
js= (jstring)
const char *value=env-&GetStringUTFChars(js,NULL);
printf("%s\d",value);
找不到输出c++的地方,直接debug查看吧:
调用java静态方法
这样一个场景:在java中生成uuid(c语言生成uuid比较复杂),在c中调用java中的方法获取uuid,生成一个文件uuid.txt,并向文件写入helloworld。
试了很多次,androidstudio始终fopen文件失败,找不出原因,操作文件的功能先放下。
private native void generateFileByC();
private static String getUUID()
return UUID.randomUUID().toString();
extern "C"
JNIEXPORT void JNICALL
Java_com_example_huozhenpeng_myapplication_MainActivity_generateFileByC(JNIEnv *env,
jobject instance) {
jcl=env-&GetObjectClass(instance);
jmd=env-&GetStaticMethodID(jcl,"getUUID","()Ljava/lang/S");
jstring jsg= (jstring) env-&CallStaticObjectMethod(jcl, jmd);
const char *p =env-&GetStringUTFChars(jsg,NULL);
char s[100];
sprintf(s,"/storage/emulated/0/%s.txt",p);
printf("%s\n",s);
jni操作java构造方法
例如:c语言中没有Date对象,如果我们要获取当前时间就比较麻烦,所以直接在jni中获取java的Date然后调用Date的getTime()方法。
TextView textView= (TextView) findViewById(R.id.sample_text);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date date=new Date(testJniCustructor());
textView.setText("当前时间:"+simpleDateFormat.format(date));
private native long testJniCustructor();
extern "C"
JNIEXPORT jlong JNICALL
Java_com_example_huozhenpeng_myapplication_MainActivity_testJniCustructor(JNIEnv *env,
jobject instance) {
jcs=env-&FindClass("java/util/Date");
jmd=env-&GetMethodID(jcs,"&init&","()V");//构造函数的方法名都是&init&
//实例化Date
job=env-&NewObject(jcs,jmd);
//得到getTime的methodId
jme=env-&GetMethodID(jcs,"getTime","()J");//long的签名是J不是L
jlong jl=env-&CallLongMethod(job,jme);
测试结果:
操作String
关于String乱码
在java层定义String,传递给jni
setString("好好学习");
private native void setString(String str);
extern "C"
JNIEXPORT void JNICALL
Java_com_example_huozhenpeng_myapplication_MainActivity_setString(JNIEnv *env, jobject instance,
jstring str_) {
const char *str = env-&GetStringUTFChars(str_, NULL);
env-&ReleaseStringUTFChars(str_, str);
没有演示出来乱码,尴尬了。有乱码的百度下啊,基本上windows的话用的是WideCharToMultiByte,其他的貌似需要借助三方。
在jni定义字符串,传给java
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_huozhenpeng_myapplication_MainActivity_getStringFromC(JNIEnv *env,
jobject instance) {
const char *p="哈哈哈哈";
return env-&NewStringUTF(p);
private native String getStringFromC();
TextView textView= (TextView) findViewById(R.id.sample_text);
textView.setText(getStringFromC());
测试结果:
没有乱码,尴尬。
如果有乱码的话可以借助java层的String类带charset的构造方法实现。
看下GetStringUTFChars的第三个参数的作用:
当从JNI函数GetStringUTFChars函数中返回得到字符串B时,如果B是原始字符串java.lang.String的一份拷贝,则isCopy
被赋值为JNI_TRUE。如果B是和原始字符串指向的是JVM中的同一份数据,则isCopy
被赋值为JNI_FALSE。 当isCopy
为JNI_FALSE时,本地代码绝不能修改字符串的内容,否则JVM中的原始字符串也会被修改,这会打破Java语言中字符串不可变的规则
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注www.itbaizhan.com 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具。了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板。 思维导图...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。 1、一个&.java&源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个publ...
一、JNI调用java中的非静态方法 1.获取java中声明的函数的签名 1&java中在包名为com.hubin.jin 的Text.java文件中申明了getRandomInt()方法 2&cd到对应的Test.java文件生成的Test.class目录下执行javap...
数着一圈圈的年轮,时间把指纹悄悄地抹上了眼角,额头,嘴唇...密密麻麻,蔓延至树根,勾勒着春去秋来的茂盛,荒草丛生的青春,绕一圈,人生的悟道参禅... 多年以后 你,在哪里?我,是否还记得曾经?等待花开的季节,选择了诗和远方,未停的脚步,是否能够慢下来...天界辽阔,迷信着...
案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: 这样当有重复记录就会忽略,执行后返回数字0 还有个应用就是复制表,避免重复记录: 方案二:使用Replace 语法格式: ...算法说明:REPL...
天黑请闭眼
: 问题背景 在这样一个难得阳光灿烂的上午,大家都沐浴在清晨的清爽之中的时候……好吧,我编不下去了,其实就是大清早被通知说我们的消息显示的不正确,然后开始排查问题,经由定位之后发现问题在于MQ消息没有发送成功,导致生成的信息有缺失,然而悲剧的是祸不单行,由于之...
(曲:《凉凉》) 女:飘飘桃花香
醉一人心迷茫
化一世倾城妆
觅真情不躲藏
念念不忘 男:轩辕三千丈
领兵独守边疆
虽熬两鬓苍苍
仍战到不退不跪不成殇
举世无双 女:悠悠笛声随风寄到西凉
万水千山思你无妨 男:...Java 代码和 C++ 代码的互调 - 简书
Java 代码和 C++ 代码的互调
Java 代码调用 C++ 函数
小伙伴们制作了一款独具创意的Android应用,只可惜这个应用某些模块的运行效率非常低。一个自然的想法是,使用 C++ 重写那些已然成为性能拖油瓶的模块。那么现在问题来了,我们怎么才能从 Java 代码里面调用 C++ 函数呢?
通过查阅文档,小伙伴们找到了合适的方案。Java 给我们提供了一组简单的接口(Java Native Interface, JNI),允许我们在 Java 应用程序中加载和使用动态共享库。
首先,在 Java 的类中声明 Native 方法。Native 方法和普通方法的声明方式一致,只是多了一个 native 关键字:
// Dog.java
package com.
public class Dog {
public native void speak();
public native int getAge();
Native 方法只声明,不定义,具体的实现在 C++ 动态共享库中
应用启动后,在合适的时机载入动态共享库。假设共享库名为 libCppModule.so:
// Dog.java
package com.
public class Dog {
System.loadLibrary("CppModule");
注意如果模块的名称为“libxxx”,在载入的时候要省略掉“lib”,只填入"xxx"。
对 libCppModule 中所有的公有接口,我们都必须按照下面的规则加以封装:
// Dog.cpp
extern "C" {
jint JNICALL Java_com_example_Dog_getAge(JNIEnv* env, jobject thiz)
void JNICALL Java_com_example_Dog_speak(JNIEnv* env, jobject thiz)
// Do something.
至此,小伙伴们感慨道:美好的生活又回来了!
C++ 代码调用 Java 方法
既然 Java 调用 C++ 函数是如此的简单,那么反过来,在 C++ 中使用 Java 某个类的方法是不是也行得通呢?
当然也是可以的!小伙伴们动手做了一番尝试,把具体的步骤纪录在了下面。
第一步,在类中定义希望被 C++ 调用的方法,必须是静态方法:
// Dog.java
package com.
public class Dog {
// This method is intended to be called by C++
public static void echo(String msg) {
Log.i("Dog", "Echo message: " + msg);
第二步,从 C++ 代码中调用上面定义的 echo 方法:
// Dog.cpp
void dog_echo() {
// 取得 JNIEnv 实例
JNIEnv *env = ...
// 1. 找到目标类
jclass _class = env-&FindClass("com/example/Dog");
// 2. 找到目标方法
jmethodId method = env-&GetStaticMethodID(_class, "echo", "(Ljava/lang/S)V");
// 3. 调用该方法
env-&CallStaticVoidMethod(_class, method, "I'm a foo");
// 4. 释放局部引用
env-&DeleteLocalRef(_class)
注意,JNIEnv 的实例只在当前线程中有效。
如果你使用的是 C 语言,那么语法将稍有不同:
void dog_echo() {
// 取得 JNIEnv 实例
JNIEnv *env = ...
// 1. 找到目标类
jclass _class = (*env)-&FindClass(env, "com/example/Dog");
// 2. 找到目标方法
jmethodId method = (*env)-&GetStaticMethodID(env, _class, "echo", "(Ljava/lang/S)V");
// 3. 调用该方法
(*env)-&CallStaticVoidMethod(env, _class, method, "I'm a foo");
// 4. 释放局部引用
(*env)-&DeleteLocalRef(env, _class)
你看出其中的差别来了吗?
我们知道,一个函数的签名包括返回值、函数名和参数三部分(如果是类方法的话,还需要包括类名),在匹配目标方法的时候,必须无二义性地分别描述出这几个组成部分。GetStaticMethodId 有三个参数,第一个参数指明了类名,第二个参数指明了函数名。第三个参数最特别,它使用一种事先约定好的格式指明了目标函数的参数和返回类型:(&arg1_type&&arg2_type&&…&)return_type,多个参数类型直接拼装成字符串,中间没有分隔字符。
Java 中的数据类型并不能直接在原生代码中使用,你必须使用它们经过编码之后的版本:
Java 数据类型
jclass _class = env-&FindClass(env, "com/example/Dog");
jmethodId method = env-&GetStaticMethodID(_class, "hasError", "(Ljava/lang/SIID)Z");
上面的代码将会匹配 com.example.Dog 类中具有如下签名的方法:boolean hasError(String msg, int param1, int param2, double param3)。
进行实际调用的时候需要根据不同的返回类型使用不同的调用函数,比如CallStaticVoidMethod、CallStaticBooleanMethod 等。这组函数的参数相同:第一个参数是已取得的目标类,第二个参数是已匹配的目标方法,接下来是传递给目标方法的不定个数的实参。
C++ 代码调用 Java 方法时的异步回调模式
啧啧,探索到了这么多实用的技能,小伙伴们越发开心起来。趁着这股探索的热情还没有消散,小伙伴们又提出了下面的问题:怎样在 C++ 代码调用 Java 方法的时候使用异步回调模式?
异步回调模式无处不在,尤其是在涉及到网络通信的编程中。通过上面所讨论的内容,我们知道,C++ 调用 Java 方法的时候并不能直接传递回调函数作为参数。
但是我们完全可以传递回调函数的指针啊!
Java 中的 long 类型使用8个字节来表示整数,足够存储一个函数指针。千万不能使用 int 类型,因为 int 类型只有4个字节,在64位机器上不足以表示一个指针值。相对应的,我们在 C++ 代码中使用 long long 类型来表示一个8字节整数。
原理分析透彻之后,实现就再简单不过了。下面是一个完整的示例:
// Dog.java
package com.
public class Dog {
private static Dog _instance = NULL;
public static Dog getInstance() {
if (_instance == NULL) {
_instance = new Dog();
public static void echo(String msg, long ptrToCallback) {
Log.i("Dog", "Echo message: " + msg);
getInstance().onEchoComplete(ptrToCallback);
public native void onEchoComplete(long ptrToCallback);
// Dog.cpp
typedef long long ptr_to_
// 回调函数
void onCallback() {
// Do something.
// C++ 调用 Java
void dog_echo() {
// 取得 JNIEnv 实例
JNIEnv *env = ...
// 回调函数的指针
ptr_to_func ptrToCallback = onC
jclass _class = env-&FindClass("com/example/Dog");
jmethodId method = env-&GetStaticMethodID(_class, "echo", "(Ljava/lang/SD)V");
// 传递回调函数的指针给 Java 方法
env-&CallStaticVoidMethod(_class, method, ptrToCallback);
env-&DeleteLocalRef(_class)
extern "C" {
// Native方法 Java调用C++
JNIEXPORT void JNICALL Java_com_example_Dog_onEchoComplete(JNIEnv *env, jobject obj, jlong ptrToCallback) {
onCallback cb = (onCallback)ptrToC
// 调用回调函数
如果你需要获取更多关于 JNI 的参考内容,请访问 。
上士闻道,勤而行之;中士闻道,若存若亡;下士闻道,大笑之。弗笑,不足以为道。
Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具。了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板。 思维导图...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。 1、一个&.java&源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个publ...
在前面一篇文章中,我们分析了Android应用程序窗口的绘图表面的创建过程。Android应用程序窗口的绘图表面在创建完成之后,我们就可以从上到下地绘制它里面的各个视图了,即各个UI元素了。不过在绘制这些UI元素之前,我们还需要从上到下地测量它们实际所需要的大小,以及对它们...
Part 1 观后感 整部影片的视觉感让我短暂的忘记了地球的存在,而是完全沉浸的宇宙的空间之中。依稀还记得一共出现了四个星球,除了地球以外,都没有留下太多的印象。 格鲁特的出镜率明显比上次要高很多,而且把格鲁特表现的极为可爱,如宠物一般,我想这将会是之后银河护卫队的衍生产品...
家具销售技巧:通过信息互换,可以获得一些客户的电话,所以前期就转为电话销售。电话家具销售有哪些技巧呢? 1.总结产品的一句话把卖点,提炼自身的优势,在短时间内迅速吸引客户的注意力,千万不能三句话讲完了,把自己的公司历史介绍了一遍,但是客户还是不知道你是干什么的。提炼卖点要时...
添加frameworklibsqlite3.dylib并 import &FMDB.h& FMDatabase基本使用方法 defineKFileName @&tmp.db& 创建或打开数据库-(BOOL)openDatabase{// 设置创建路径NSString hom...
微信公众号做晚又更新了所有公众号开放了在文章中可以插入链接的功能,这个功能好呀,给流量主增加了接广告的权限,可以接一些贴片广告,文字链接广告,第三方广告联盟平台等大有作为,又增加了变现通道,微信开放这个功能实在是被今日头条,百家号,搜狐号等新型的自媒体平台逼急了,腾讯一家独...
今天产品群内的一位COO前辈问我,创业公司做一款APP需要花费多长时间和金钱?虽然我现在在公司的头衔是营销总监,但是我本质还是一名产品经理呀,后面就巴拉巴拉一大堆。 每过段时间,总会被人问到这样的问题。今天决定一劳永逸的写出来,下次有人问,直接给链接! 还是老规矩,产品经理...17:18 提问
C++ 代码 把这个方法翻译成java版本
把这个方法翻译成java版本
unsigned short HJTCoder::GenCRC(unsigned char* data, int len)
unsigned short temp1;
unsigned short temp=0
for( i=0; i& i++)
temp = *(data+i) ^ ((temp&&8) & 0xFF);
for (j=0; j&8; j++)
if (temp1 & 0x0001)
temp^=0xa001;
按赞数排序
unsigned char* data
Java换成数组
char data[]
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐}

我要回帖

更多关于 java增删改查代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信