小编fre*_*ith的帖子

JNI:调用 GetStaticMethodID 失败

我正在编写一些代码来获取生成的线程以从 C++ 调用静态 Java 方法。

如果放置在来自 Java 的本机调用中,则调用该方法的位可以正常工作,但不能来自具有附加 JNIEnv 的线程。

我已经设置了一个 JavaVM* 如下:

jint JNI_OnLoad(JavaVM* jvm, void* reserved)
{
    LOGI("Setting Java Virtual Machine");

    ThreadJNIEnvironment::javaVM = jvm;

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

这确实被调用了。

然后我生成另一个线程,并从该线程执行以下操作:

JNIEnv* env;
jint ret = ThreadJNIEnvironment::javaVM->AttachCurrentThread(&env, NULL);

LOGI("AttachCurrentThread returned %d", ret);

jclass interfaceClass = env->FindClass("com/ecmsys/mcb/model/McbInterface");
jmethodID testMethod = env->GetStaticMethodID(interfaceClass, "Test", "()V");
env->CallStaticVoidMethod(interfaceClass, testMethod);
Run Code Online (Sandbox Code Playgroud)

AttachCurrentThread 返回 0。

GetStaticMethod 会因以下错误而崩溃:

Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1).....
Run Code Online (Sandbox Code Playgroud)

我只是看不出我做了什么来扰乱它......哦等等......你不能在没有做一些设置的情况下从一个衍生的线程访问 Java 应用程序类......

jint JNI_OnLoad(JavaVM* jvm, void* reserved)
{
    LOGI("Setting Java Virtual Machine");
    ThreadJNIEnvironment::javaVM …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface android

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

远程循环const引用似乎没有什么区别

如果我在C++ 11中有一个基于for循环的范围,

for(auto const &ticket : ticketStrip->tickets()) {
  ticket->ClearCalled();
}
Run Code Online (Sandbox Code Playgroud)

为什么我能够在循环内调用票证上的非const方法,例如当ClearCalled()没有标记为const时?

void Ticket::ClearCalled() { ... }
Run Code Online (Sandbox Code Playgroud)

ClearCalled确实修改了票证内部,因此不应将其标记为const.我知道我应该用

auto &ticket
Run Code Online (Sandbox Code Playgroud)

但我刚试过

auto const &ticket
Run Code Online (Sandbox Code Playgroud)

并且编译器接受了它.

票的类型是

boost::shared_ptr<AbstractMainStageTicket>
Run Code Online (Sandbox Code Playgroud)

并将一些新代码放入:

ticket->ClearCalled();
ticket.reset();
Run Code Online (Sandbox Code Playgroud)

使编译器标记复位不是const的错误.

谢谢你的帮助!

我正在使用Android的GNU 4.6工具链.

c++ c++11

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

共享指针和指向对象的常量

如果我有课,比方说,

class Car {
  public:
    void Drive();
    void DisplayMileage() const;
};
Run Code Online (Sandbox Code Playgroud)

我基于这个类创建了一个共享指针,

typedef boost::shared_ptr<Car> CarPtr;
Run Code Online (Sandbox Code Playgroud)

然后我继续填充CarPtrs的载体,

std::vector<CarPtrs> cars...;
Run Code Online (Sandbox Code Playgroud)

我现在想迭代向量并做一些事情:

for(auto const &car : cars) {
   car->DisplayMileage(); // I want this to be okay
   car->Drive(); // I want the compilation to fail here because Drive isn't const.
}
Run Code Online (Sandbox Code Playgroud)

这是否可以在不将汽车的共享指针转换为指向const汽车的共享指针的情况下实现?

c++ boost c++11

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

标签 统计

c++ ×3

c++11 ×2

android ×1

boost ×1

java ×1

java-native-interface ×1