小编Tom*_*Tom的帖子

使用包含名为"Node"的类的JNI C++代码,JVM无法正常工作

我自己和一些队友一直无法理解为什么下面的代码片段在使用JVM版本1.6u23到1.6u31(本帖子的最新版本)时不能提供正确的输出.此代码段代表了一个更大问题的简化:

更新:稍微修改了示例,重点关注"virtual_function()"似乎没有被调用的问题.

更新:根据迄今为止的评论更简化示例.

NodeTester.cpp:

#include <iostream>
#include <jni.h>

class Node {
  public:
    Node () :m_counter(0) {}
    virtual ~Node () {}

    virtual void virtual_function () {
      m_counter += 10;
    }

    void non_virtual_function () {
      m_counter += 1;
    }

    int get_counter () {
      return m_counter;
    }

  private:
    int m_counter;

};

extern "C" {
  JNIEXPORT void JNICALL Java_NodeTester_testNode (JNIEnv *jni_env_rptr, 
                                                   jclass java_class) {
    Node *node_rptr = new Node();
    node_rptr->non_virtual_function();
    node_rptr->virtual_function();

    std::cout << node_rptr->get_counter() << std::endl;

    delete node_rptr;
  }
}
Run Code Online (Sandbox Code Playgroud)

NodeTester.java:

public class NodeTester …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface

24
推荐指数
2
解决办法
1838
查看次数

在python中,导入类与导入类模块的优缺点是什么?

我正在为一个约30名开发人员的团队编写一套python编码指南.作为我的文档的基础,到目前为止,我已经研究了谷歌python风格指南PEP 8风格指南,并结合了两者的信息.

谷歌风格指南比PEP 8更具限制性的地方是进口.Google指南要求开发人员仅导入包和模块,然后通过更合格的名称引用其中的项目.例如:

from pkg import module
...
my_class = module.MyClass()
Run Code Online (Sandbox Code Playgroud)

理由是"每个标识符的来源以一致的方式表示".对于我们的项目,我们打算使用两个或三个级别的包进行组织,因此要了解标识符的完整来源,读者可能还需要检查import语句.我想提倡这种导入方式作为"首选风格":

from pkg.module import MyClass
...
my_class = MyClass()
Run Code Online (Sandbox Code Playgroud)

恕我直言,当名称更简洁时,改进了列表推导等python结构中的可读性.

我不清楚的是python解释器可能在幕后做什么.例如,MyClass现在是该模块的全局命名空间的一部分,还是该模块的所有导入器?(这会很糟糕,可能会导致一些奇怪的错误;​​如果这是真的,我会提倡谷歌风格).

我的python开发经验仅限于6个月(我们的项目专家咨询的人数不多),所以我希望从社区获得更多信息.以下是我已经研究过的一些项目:

effbot - 关于进口的讨论

堆栈溢出 - 导入与导入

python文档 - 模块

python文档 - 导入

谢谢您的反馈!

python import

6
推荐指数
1
解决办法
855
查看次数

将remove_if与C以null结尾的字符串一起使用

我有一种情况,我想从一个以NULL结尾的char*中有效地删除一个字符.我可以假设传入的字符串很大(即复制效率不高); 但我也可以假设我不需要取消分配未使用的内存.

我以为我可以std::remove_if用于此任务(用NULL-terminator替换返回的迭代器中的字符),并设置以下测试程序以确保我的语法正确:

#include <algorithm>
#include <iostream>

bool is_bad (const char &c) {
  return c == 'a';
}

int main (int argc, char *argv[]) {
  char * test1 = "123a45";
  int len = 6;
  std::cout << test1 << std::endl;
  char * new_end = std::remove_if(&test1[0], &test1[len], is_bad);
  *new_end = '\0';
  std::cout << test1 << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,这个程序编译,我正在Segmentation Fault某个地方remove_if- 这里的输出来自gdb:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400914 in std::remove_copy_if<char*, char*, bool (*)(char …
Run Code Online (Sandbox Code Playgroud)

c++ pointers remove-if

1
推荐指数
1
解决办法
250
查看次数

在Java中,使用logback框架,有一种方法可以为繁琐的日志消息动态配置限制

我们在现场部署了一个系统,该系统具有使用logback日志记录框架的Java服务.每个服务都有自己的logback配置文件.

我们发现每秒多次以WARN级别发出特定的日志消息.我们真的只对看到这个消息感兴趣,例如,一次/分钟,以便我们知道问题正在发生; 但是我们不想提高类的日志记录级别,以便丢弃INFO级别的其他消息.

修改代码不是一种选择,也不会对涉及重新启动违规服务的系统进行任何修改.但是,我们可以修改日志配置.

有没有办法在logback中通过XML配置文件来实现这种行为?

更新 消息类似,但不相同; 例如:

WARN The following ID will be dropped: 12345
WARN The following ID will be dropped: 54321
Run Code Online (Sandbox Code Playgroud)

java logback

1
推荐指数
1
解决办法
681
查看次数