Error[8]: Undefined offset: 205, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

问题1:c++ string 转 char*

data() 方法:

string str = "hello";
const char* p = str.data();//加const  或者用char * p=(char*)str.data();的形式

c_str()方法:

string str=“world”;
const char *p = str.c_str();//同上,要加const或者等号右边用char*

参考博客

问题2:jstring 转为 char*
const char* GetStringUTFChars(jstring string, jboolean* isCopy)

方法说明:
j_str jstring 类型(Java传递给本地代码的字符串指针)

isCopy: 取值JNI_TRUE和JNI_FALSE,如果值为JNI_TRUE,表示返回JVM内部源字符串的一份拷贝,并为新产生的字符串分配内存空间。如果值为JNI_FALSE,表示返回JVM内部源字符串的指针,意味着可以通过指针修改源字符串的内容,不推荐这么做,因为这样做就打破了Java字符串不能修改的规定。但我们在开发当中,并不关心这个值是多少,通常情况下这个参数填NULL即可。

因为Java默认使用Unicode编码,而C/C++默认使用UTF编码,所以在本地代码中 *** 作字符串的时候,必须使用合适的JNI函数把jstring转换成C风格的字符串。JNI支持字符串在Unicode和UTF-8两种编码之间转换,GetStringUTFChars可以把一个jstring指针(指向JVM内部的Unicode字符序列)转换成一个UTF-8格式的C字符串。在上例中sayHello函数中我们通过GetStringUTFChars正确取得了JVM内部的字符串内容。

问题3:打印Log
  1. 导入头文件:#include
  2. 方法:
std::string hello = "Hello from C++";
__android_log_print(ANDROID_LOG_ERROR, kTAG, "%s", hello.c_str());
  1. 使用宏定义简化方法的使用
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, kTAG, __VA_ARGS__))

std::string hello = "Hello from C++";
LOGE("%s", hello.data());
问题4:meset 函数

1. 函数原型:

# include 
// 虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '// 因为字符 '// 所以通常我们就写“0”' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 'void' 的作用,' 和 0 是等价的,
*
memset
( void*,int ,sunsigned long c) ; JNI_OnLoad n(*

2. 函数功能:
将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零 *** 作的一种最快方法。

问题5:JavaVM 和 JNIEnv

1. JavaVM
JavaVM 是虚拟机在JNI层的代表,一个进程只有一个JavaVM,所有的线程共用一个JavaVM
2. JNIEnv
JNIEnv 表示Java调用native语言环境,是一个封装了几乎全部JNI方法的指针。
JNIEnv只在创建它的线程生效,不能跨进程传递,不同线程的JNIEnv彼此独立。
native环境创建的线程,如果需要访问JNI,必须要调用AttachCurrentThread关联,并使用DetachCurrentThread 解除连接。

JNIEXPORT jint JNICALL
,voidJavaVM *vm) * =reservedNULL {
    JNIEnv ;env = -1
    jint result ; if(GetEnv
    ( (vm->void**) &,) !=env) JNI_VERSION_1_6return ; JNI_OK} {
        // 返回jni的版本 resultreturn
    ;
    
    }
        全局引用 作用域 :
            空间 : 可以 跨方法 , 跨线程使用
            时间 : 创建后可以使用 , 手动释放后全局引用失效

    全局引用创建 : NewGlobalRef
    全局引用释放 : DeleteGlobalRef
    全局引用会阻止 JVM 回收该引用
 JNI_VERSION_1_6//生成局部引用 , 该局部引用使用完毕后可释放
=
问题6 :JNIEnv* # NewGlobalRef {全局引用}
FindClass
        (
        jclass tmp_class "kim/hsl/jni/Teacher" env->);//将上述生成的局部引用变成 全局引用=static_cast

        <
        //全局引用释放时 , env->DeleteGlobalRef(class_teacher_global) 即可释放下面转换的 全局引用
        class_teacher_global ( NewGlobalRef(jclass>)env->);tmp_class//将局部引用释放掉DeleteLocalRef(

        )
        env->;=tmp_classFindClass(

参考博客

问题7:JNI 创建java对象
    jclass cls "com/example/myapplication/Util" env->);//调用无参构造函数=GetMethodID

    (
    //构造函数是没有函数名的, 就代表构造函数. ()V 代表无参无返回值
    jmethodID init , env->,"()V"cls) ""; //调用有参构造函数,两个参数,一个是 String, 一个是 Int=GetMethodID
    (
    jmethodID init , env->,"(Ljava/lang/String;I)V"cls) ""; //创建实例=NewObject
	(
    jobject util , env->);cls对应于Java端的数据类型,我们也可以看一下下面的表: 
Java 类型 类型签名
boolean Z
byte    B
char    C
short   S
int     I
long    L
float   F
double  D
类      L全限定名;,比如String, 其签名为Ljava/lang/util/String;
数组    [类型签名, 比如 [B
 init// 获取 getBuildVersion 方法// ()Ljava/lang/String; 一定不能少分号

参考博客

问题8:JNI 方法签名的类型
=

参考博客

问题9:JNI 调用 static Java 方法
GetStaticMethodID
(
jmethodID versionFun . env->,"getBuildVersion"g_ctx,jniHelperClz"()Ljava/lang/String;" ); [+++][+++][+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 29, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 206, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

问题1:c++ string 转 char*

data() 方法:

string str = "hello";
const char* p = str.data();//加const  或者用char * p=(char*)str.data();的形式

c_str()方法:

string str=“world”;
const char *p = str.c_str();//同上,要加const或者等号右边用char*

参考博客

问题2:jstring 转为 char*
const char* GetStringUTFChars(jstring string, jboolean* isCopy)

方法说明:
j_str jstring 类型(Java传递给本地代码的字符串指针)

isCopy: 取值JNI_TRUE和JNI_FALSE,如果值为JNI_TRUE,表示返回JVM内部源字符串的一份拷贝,并为新产生的字符串分配内存空间。如果值为JNI_FALSE,表示返回JVM内部源字符串的指针,意味着可以通过指针修改源字符串的内容,不推荐这么做,因为这样做就打破了Java字符串不能修改的规定。但我们在开发当中,并不关心这个值是多少,通常情况下这个参数填NULL即可。

因为Java默认使用Unicode编码,而C/C++默认使用UTF编码,所以在本地代码中 *** 作字符串的时候,必须使用合适的JNI函数把jstring转换成C风格的字符串。JNI支持字符串在Unicode和UTF-8两种编码之间转换,GetStringUTFChars可以把一个jstring指针(指向JVM内部的Unicode字符序列)转换成一个UTF-8格式的C字符串。在上例中sayHello函数中我们通过GetStringUTFChars正确取得了JVM内部的字符串内容。

问题3:打印Log
  1. 导入头文件:#include
  2. 方法:
std::string hello = "Hello from C++";
__android_log_print(ANDROID_LOG_ERROR, kTAG, "%s", hello.c_str());
  1. 使用宏定义简化方法的使用
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, kTAG, __VA_ARGS__))

std::string hello = "Hello from C++";
LOGE("%s", hello.data());
问题4:meset 函数

1. 函数原型:

# include 
// 虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '// 因为字符 '// 所以通常我们就写“0”' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 'void' 的作用,' 和 0 是等价的,
*
memset
( void*,int ,sunsigned long c) ; JNI_OnLoad n(*

2. 函数功能:
将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零 *** 作的一种最快方法。

问题5:JavaVM 和 JNIEnv

1. JavaVM
JavaVM 是虚拟机在JNI层的代表,一个进程只有一个JavaVM,所有的线程共用一个JavaVM
2. JNIEnv
JNIEnv 表示Java调用native语言环境,是一个封装了几乎全部JNI方法的指针。
JNIEnv只在创建它的线程生效,不能跨进程传递,不同线程的JNIEnv彼此独立。
native环境创建的线程,如果需要访问JNI,必须要调用AttachCurrentThread关联,并使用DetachCurrentThread 解除连接。

JNIEXPORT jint JNICALL
,voidJavaVM *vm) * =reservedNULL {
    JNIEnv ;env = -1
    jint result ; if(GetEnv
    ( (vm->void**) &,) !=env) JNI_VERSION_1_6return ; JNI_OK} {
        // 返回jni的版本 resultreturn
    ;
    
    }
        全局引用 作用域 :
            空间 : 可以 跨方法 , 跨线程使用
            时间 : 创建后可以使用 , 手动释放后全局引用失效

    全局引用创建 : NewGlobalRef
    全局引用释放 : DeleteGlobalRef
    全局引用会阻止 JVM 回收该引用
 JNI_VERSION_1_6//生成局部引用 , 该局部引用使用完毕后可释放
=
问题6 :JNIEnv* # NewGlobalRef {全局引用}
FindClass
        (
        jclass tmp_class "kim/hsl/jni/Teacher" env->);//将上述生成的局部引用变成 全局引用=static_cast

        <
        //全局引用释放时 , env->DeleteGlobalRef(class_teacher_global) 即可释放下面转换的 全局引用
        class_teacher_global ( NewGlobalRef(jclass>)env->);tmp_class//将局部引用释放掉DeleteLocalRef(

        )
        env->;=tmp_classFindClass(

参考博客

问题7:JNI 创建java对象
    jclass cls "com/example/myapplication/Util" env->);//调用无参构造函数=GetMethodID

    (
    //构造函数是没有函数名的, 就代表构造函数. ()V 代表无参无返回值
    jmethodID init , env->,"()V"cls) ""; //调用有参构造函数,两个参数,一个是 String, 一个是 Int=GetMethodID
    (
    jmethodID init , env->,"(Ljava/lang/String;I)V"cls) ""; //创建实例=NewObject
	(
    jobject util , env->);cls对应于Java端的数据类型,我们也可以看一下下面的表: 
Java 类型 类型签名
boolean Z
byte    B
char    C
short   S
int     I
long    L
float   F
double  D
类      L全限定名;,比如String, 其签名为Ljava/lang/util/String;
数组    [类型签名, 比如 [B
 init// 获取 getBuildVersion 方法// ()Ljava/lang/String; 一定不能少分号

参考博客

问题8:JNI 方法签名的类型
=

参考博客

问题9:JNI 调用 static Java 方法
GetStaticMethodID
(
jmethodID versionFun . env->,"getBuildVersion"g_ctx,jniHelperClz"()Ljava/lang/String;" ); [+++][+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 29, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 207, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

问题1:c++ string 转 char*

data() 方法:

string str = "hello";
const char* p = str.data();//加const  或者用char * p=(char*)str.data();的形式

c_str()方法:

string str=“world”;
const char *p = str.c_str();//同上,要加const或者等号右边用char*

参考博客

问题2:jstring 转为 char*
const char* GetStringUTFChars(jstring string, jboolean* isCopy)

方法说明:
j_str jstring 类型(Java传递给本地代码的字符串指针)

isCopy: 取值JNI_TRUE和JNI_FALSE,如果值为JNI_TRUE,表示返回JVM内部源字符串的一份拷贝,并为新产生的字符串分配内存空间。如果值为JNI_FALSE,表示返回JVM内部源字符串的指针,意味着可以通过指针修改源字符串的内容,不推荐这么做,因为这样做就打破了Java字符串不能修改的规定。但我们在开发当中,并不关心这个值是多少,通常情况下这个参数填NULL即可。

因为Java默认使用Unicode编码,而C/C++默认使用UTF编码,所以在本地代码中 *** 作字符串的时候,必须使用合适的JNI函数把jstring转换成C风格的字符串。JNI支持字符串在Unicode和UTF-8两种编码之间转换,GetStringUTFChars可以把一个jstring指针(指向JVM内部的Unicode字符序列)转换成一个UTF-8格式的C字符串。在上例中sayHello函数中我们通过GetStringUTFChars正确取得了JVM内部的字符串内容。

问题3:打印Log
  1. 导入头文件:#include
  2. 方法:
std::string hello = "Hello from C++";
__android_log_print(ANDROID_LOG_ERROR, kTAG, "%s", hello.c_str());
  1. 使用宏定义简化方法的使用
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, kTAG, __VA_ARGS__))

std::string hello = "Hello from C++";
LOGE("%s", hello.data());
问题4:meset 函数

1. 函数原型:

# include 
// 虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '// 因为字符 '// 所以通常我们就写“0”' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 'void' 的作用,' 和 0 是等价的,
*
memset
( void*,int ,sunsigned long c) ; JNI_OnLoad n(*

2. 函数功能:
将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零 *** 作的一种最快方法。

问题5:JavaVM 和 JNIEnv

1. JavaVM
JavaVM 是虚拟机在JNI层的代表,一个进程只有一个JavaVM,所有的线程共用一个JavaVM
2. JNIEnv
JNIEnv 表示Java调用native语言环境,是一个封装了几乎全部JNI方法的指针。
JNIEnv只在创建它的线程生效,不能跨进程传递,不同线程的JNIEnv彼此独立。
native环境创建的线程,如果需要访问JNI,必须要调用AttachCurrentThread关联,并使用DetachCurrentThread 解除连接。

JNIEXPORT jint JNICALL
,voidJavaVM *vm) * =reservedNULL {
    JNIEnv ;env = -1
    jint result ; if(GetEnv
    ( (vm->void**) &,) !=env) JNI_VERSION_1_6return ; JNI_OK} {
        // 返回jni的版本 resultreturn
    ;
    
    }
        全局引用 作用域 :
            空间 : 可以 跨方法 , 跨线程使用
            时间 : 创建后可以使用 , 手动释放后全局引用失效

    全局引用创建 : NewGlobalRef
    全局引用释放 : DeleteGlobalRef
    全局引用会阻止 JVM 回收该引用
 JNI_VERSION_1_6//生成局部引用 , 该局部引用使用完毕后可释放
=
问题6 :JNIEnv* # NewGlobalRef {全局引用}
FindClass
        (
        jclass tmp_class "kim/hsl/jni/Teacher" env->);//将上述生成的局部引用变成 全局引用=static_cast

        <
        //全局引用释放时 , env->DeleteGlobalRef(class_teacher_global) 即可释放下面转换的 全局引用
        class_teacher_global ( NewGlobalRef(jclass>)env->);tmp_class//将局部引用释放掉DeleteLocalRef(

        )
        env->;=tmp_classFindClass(

参考博客

问题7:JNI 创建java对象
    jclass cls "com/example/myapplication/Util" env->);//调用无参构造函数=GetMethodID

    (
    //构造函数是没有函数名的, 就代表构造函数. ()V 代表无参无返回值
    jmethodID init , env->,"()V"cls) ""; //调用有参构造函数,两个参数,一个是 String, 一个是 Int=GetMethodID
    (
    jmethodID init , env->,"(Ljava/lang/String;I)V"cls) ""; //创建实例=NewObject
	(
    jobject util , env->);cls对应于Java端的数据类型,我们也可以看一下下面的表: 
Java 类型 类型签名
boolean Z
byte    B
char    C
short   S
int     I
long    L
float   F
double  D
类      L全限定名;,比如String, 其签名为Ljava/lang/util/String;
数组    [类型签名, 比如 [B
 init// 获取 getBuildVersion 方法// ()Ljava/lang/String; 一定不能少分号

参考博客

问题8:JNI 方法签名的类型
=

参考博客

问题9:JNI 调用 static Java 方法
GetStaticMethodID
(
jmethodID versionFun . env->,"getBuildVersion"g_ctx,jniHelperClz"()Ljava/lang/String;" ); [+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 29, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
android NDK 编程学习记录_java_内存溢出

android NDK 编程学习记录

android NDK 编程学习记录,第1张

问题1:c++ string 转 char*

data() 方法:

string str = "hello";
const char* p = str.data();//加const  或者用char * p=(char*)str.data();的形式

c_str()方法:

string str=“world”;
const char *p = str.c_str();//同上,要加const或者等号右边用char*

参考博客

问题2:jstring 转为 char*
const char* GetStringUTFChars(jstring string, jboolean* isCopy)

方法说明:
j_str jstring 类型(Java传递给本地代码的字符串指针)

isCopy: 取值JNI_TRUE和JNI_FALSE,如果值为JNI_TRUE,表示返回JVM内部源字符串的一份拷贝,并为新产生的字符串分配内存空间。如果值为JNI_FALSE,表示返回JVM内部源字符串的指针,意味着可以通过指针修改源字符串的内容,不推荐这么做,因为这样做就打破了Java字符串不能修改的规定。但我们在开发当中,并不关心这个值是多少,通常情况下这个参数填NULL即可。

因为Java默认使用Unicode编码,而C/C++默认使用UTF编码,所以在本地代码中 *** 作字符串的时候,必须使用合适的JNI函数把jstring转换成C风格的字符串。JNI支持字符串在Unicode和UTF-8两种编码之间转换,GetStringUTFChars可以把一个jstring指针(指向JVM内部的Unicode字符序列)转换成一个UTF-8格式的C字符串。在上例中sayHello函数中我们通过GetStringUTFChars正确取得了JVM内部的字符串内容。

问题3:打印Log
  1. 导入头文件:#include
  2. 方法:
std::string hello = "Hello from C++";
__android_log_print(ANDROID_LOG_ERROR, kTAG, "%s", hello.c_str());
  1. 使用宏定义简化方法的使用
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, kTAG, __VA_ARGS__))

std::string hello = "Hello from C++";
LOGE("%s", hello.data());
问题4:meset 函数

1. 函数原型:

# include 
// 虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '// 因为字符 '// 所以通常我们就写“0”' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 'void' 的作用,' 和 0 是等价的,
*
memset
( void*,int ,sunsigned long c) ; JNI_OnLoad n(*

2. 函数功能:
将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零 *** 作的一种最快方法。

问题5:JavaVM 和 JNIEnv

1. JavaVM
JavaVM 是虚拟机在JNI层的代表,一个进程只有一个JavaVM,所有的线程共用一个JavaVM
2. JNIEnv
JNIEnv 表示Java调用native语言环境,是一个封装了几乎全部JNI方法的指针。
JNIEnv只在创建它的线程生效,不能跨进程传递,不同线程的JNIEnv彼此独立。
native环境创建的线程,如果需要访问JNI,必须要调用AttachCurrentThread关联,并使用DetachCurrentThread 解除连接。

JNIEXPORT jint JNICALL
,voidJavaVM *vm) * =reservedNULL {
    JNIEnv ;env = -1
    jint result ; if(GetEnv
    ( (vm->void**) &,) !=env) JNI_VERSION_1_6return ; JNI_OK} {
        // 返回jni的版本 resultreturn
    ;
    
    }
        全局引用 作用域 :
            空间 : 可以 跨方法 , 跨线程使用
            时间 : 创建后可以使用 , 手动释放后全局引用失效

    全局引用创建 : NewGlobalRef
    全局引用释放 : DeleteGlobalRef
    全局引用会阻止 JVM 回收该引用
 JNI_VERSION_1_6//生成局部引用 , 该局部引用使用完毕后可释放
=
问题6 :JNIEnv* # NewGlobalRef {全局引用}
FindClass
        (
        jclass tmp_class "kim/hsl/jni/Teacher" env->);//将上述生成的局部引用变成 全局引用=static_cast

        <
        //全局引用释放时 , env->DeleteGlobalRef(class_teacher_global) 即可释放下面转换的 全局引用
        class_teacher_global ( NewGlobalRef(jclass>)env->);tmp_class//将局部引用释放掉DeleteLocalRef(

        )
        env->;=tmp_classFindClass(

参考博客

问题7:JNI 创建java对象
    jclass cls "com/example/myapplication/Util" env->);//调用无参构造函数=GetMethodID

    (
    //构造函数是没有函数名的, 就代表构造函数. ()V 代表无参无返回值
    jmethodID init , env->,"()V"cls) ""; //调用有参构造函数,两个参数,一个是 String, 一个是 Int=GetMethodID
    (
    jmethodID init , env->,"(Ljava/lang/String;I)V"cls) ""; //创建实例=NewObject
	(
    jobject util , env->);cls对应于Java端的数据类型,我们也可以看一下下面的表: 
Java 类型 类型签名
boolean Z
byte    B
char    C
short   S
int     I
long    L
float   F
double  D
类      L全限定名;,比如String, 其签名为Ljava/lang/util/String;
数组    [类型签名, 比如 [B
 init// 获取 getBuildVersion 方法// ()Ljava/lang/String; 一定不能少分号

参考博客

问题8:JNI 方法签名的类型
=

参考博客

问题9:JNI 调用 static Java 方法
GetStaticMethodID
(
jmethodID versionFun . env->,"getBuildVersion"g_ctx,jniHelperClz"()Ljava/lang/String;" ); 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/738378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存