当前位置: 首页 > 知识库问答 >
问题:

JNI,C++在堆栈中推入字符串

柳宏深
2023-03-14

我的C++代码,推入一个字符串到我的堆栈

#include <iostream>
#include <stack>
#include "NativeLogger.h"


std::stack<std::string> mystack;


JNIEXPORT void JNICALL
Java_NativeLogger_push(JNIEnv *env, jobject obj,jstring name)
{

  std::string s = env->GetStringUTFChars(name, 0);

  mystack.push(s);

  return;
}

JNIEXPORT void JNICALL
Java_NativeLogger_pop(JNIEnv *env, jobject obj)
{

  mystack.pop();
  return;
}

当我和Java一起运行时,我收到了一份坠毁报告,有没有办法修复它?

Java运行时环境检测到一个致命错误:

SIGSEGV(0xB)(PC=0x00007F29421A0207,PID=18007,TID=0x00007F2942D3E700)

JRE版本:Java(TM)SE运行时环境(8.0_144-B01)(build 1.8.0_144-B01)Java VM:Java HotSpot(TM)64位服务器VM(25.144-B01混合模式linux-amd64压缩oops)问题帧:C[libc.so.6+0x97207]__libc_malloc+0x197

共有1个答案

颛孙星海
2023-03-14

Java代码:

package recipeNo025;

public class HelloWorld {

  public static native void pushString(String s);
  public static native String popString();

  static {
    System.loadLibrary("HelloWorld");
  }

  public static void main(String[] args) {
    HelloWorld.pushString("Hello");
    System.out.println(HelloWorld.popString());
  }
}

C++代码

#include <iostream>
#include <stack>
#include "jni.h"
#include "recipeNo025_HelloWorld.h"

std::stack<std::string> mystack;

JNIEXPORT void JNICALL Java_recipeNo025_HelloWorld_pushString
  (JNIEnv *env, jclass obj, jstring str) {

    // we have to get string bytes into C string
    const char *c_str;
    c_str = env->GetStringUTFChars(str, NULL);
    if(c_str == NULL) {
        return;
    }

    std::cout << "Passed string: " << c_str << std::endl;

    std::string my_string(c_str);
    mystack.push(my_string);

    // after using it, remember to release the memory
    env->ReleaseStringUTFChars(str, c_str);
}

JNIEXPORT jstring JNICALL Java_recipeNo025_HelloWorld_popString
  (JNIEnv *env, jclass obj) {

    std::string s = mystack.top();
    mystack.pop();
    return env->NewStringUTF(s.c_str());
}

执行:

> java -Djava.library.path=:./lib -cp target recipeNo025.HelloWorld
Passed string: Hello
Hello

而且,我会考虑使用单例模式,而不是为堆栈使用全局变量。

 类似资料:
  • 我有一个空的整数堆栈,和以下格式的q查询:Push x:在堆栈顶部添加x Pop:移除堆栈顶部top:打印堆栈顶部示例输入:10 Push 5 top Push 6 top Push 3 top Pop top Pop top输出:5 6 3 6 5我将把我的代码放在注释中,因为我不知道怎么放在这里..我知道这是极其错误的但请我需要帮助来改进它

  • 主要内容:Stack 类中的属性,Stack 类中的方法在 C# 中,堆栈(Stack)类表示一个后进先出的对象集合,当您需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。 Stack 类中的属性 下表列出了 Stack 类中一些常用的属性: 属性 描述 Count 获取堆栈中包含的元素个数 IsSynchronized 判断是否同步对堆栈的访问(线程安全) SyncRoot 获取可用于同步对堆

  • 问题内容: 假设我有两个陈述。 哪个是堆栈内存,哪个存储在堆中? 两者之间有什么区别? 创建了多少个对象,内存中的引用如何? 最佳做法是什么? 问题答案: 所有对象都存储在堆中(包括其字段的值)。1个 局部变量(包括参数)始终包含原始值或引用,并存储在堆栈中。1个 因此,对于您的两行: 您将在堆上有两个对象(两个包含的String对象)和两个引用(每个对象一个)在堆栈上(提供且是局部变量)。 (实

  • 我目前正在编写一个程序,在Javascript中,用户输入一个内缀符号表达式作为字符串,然后将其转换为后缀符号。我很难把每个操作员推到堆栈上。下面是与我的问题相关的代码的两个主要部分。 如果(y==(“| |”-“| |”*“| |”/“| |”(“| |”)){从给定字符串推送到堆栈中,则只比较此行中的第一个字符。我一直用于测试的字符串是“3*5 6”。有没有想过为什么会这样?

  • C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。 操作 比较和分配堆栈 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素

  • 本文向大家介绍在C ++中正确使用堆栈和堆?,包括了在C ++中正确使用堆栈和堆?的使用技巧和注意事项,需要的朋友参考一下 堆栈-函数内部声明的所有变量将占用堆栈中的内存。因此,函数内的任何局部变量都位于堆栈中。 堆-这是程序的未使用内存,可用于在程序运行时动态分配内存。因此,如果我们希望某些东西的寿命比声明它的函数的寿命更长,则必须在堆上分配它。 示例 堆内存中的主要问题是碎片,而堆栈中更容易出