gpt4 book ai didi

java - Jni FindClass 返回 NULL

转载 作者:行者123 更新时间:2023-11-30 00:50:05 26 4
gpt4 key购买 nike

我在头文件中得到了 C++ 结构,

struct StatusLine
{
static jclass Class; // Lorg/apache/http/StatusLine;
static jmethodID GetStatusCode; // ()I
};

struct ByteArrayOutputStream
{
static jclass Class; // Ljava/io/ByteArrayOutputStream;
static jmethodID Constructor; // ()V
static jmethodID Close; // ()V
static jmethodID ToByteArray; // ()[B
};

struct HttpEntity
{
static jclass Class; // Lorg/apache/http/HttpEntity;
static jmethodID WriteTo; // (Ljava/io/OutputStream;)V
static jmethodID GetContent; // ()Ljava/io/InputStream;
};

cpp文件是

 #define JAVA_STATUS_LINE_CLASS             "org/apache/http/StatusLine"
#define JAVA_HTTP_ENTITY_CLASS "org/apache/http/HttpEntity"
#define JAVA_BYTE_ARRAY_OUTPUT_STREAM_CLASS "java/io/ByteArrayOutputStream"

jclass StatusLine::Class = 0;
jmethodID StatusLine::GetStatusCode = 0;

jclass ByteArrayOutputStream::Class = 0;
jmethodID ByteArrayOutputStream::Constructor = 0;
jmethodID ByteArrayOutputStream::Close = 0;
jmethodID ByteArrayOutputStream::ToByteArray = 0;

jclass HttpEntity::Class = 0;
jmethodID HttpEntity::WriteTo = 0;
jmethodID HttpEntity::GetContent = 0;

void initializeJniPointers()
{
StatusLine::Class = GetJniEnv()->FindClass(JAVA_STATUS_LINE_CLASS);
StatusLine::GetStatusCode = GetJniEnv()->GetMethodID(StatusLine::Class, "getStatusCode", "()I");


ByteArrayOutputStream::Class = GetJniEnv()->FindClass(JAVA_BYTE_ARRAY_OUTPUT_STREAM_CLASS);
ByteArrayOutputStream::Constructor = GetJniEnv()->GetMethodID(ByteArrayOutputStream::Class, "<init>", "()V");
ByteArrayOutputStream::Close = GetJniEnv()->GetMethodID(ByteArrayOutputStream::Class, "close", "()V");
ByteArrayOutputStream::ToByteArray = GetJniEnv()->GetMethodID(ByteArrayOutputStream::Class, "toByteArray", "()[B");

HttpEntity::Class = GetJniEnv()->FindClass(JAVA_HTTP_ENTITY_CLASS);
HttpEntity::WriteTo = GetJniEnv()->GetMethodID(HttpEntity::Class, "writeTo", "(Ljava/io/OutputStream;)V");
HttpEntity::GetContent = GetJniEnv()->GetMethodID(HttpEntity::Class, "getContent", "()Ljava/io/InputStream;");
}

函数 initializeJniPointers() 在线 StatusLine::GetStatusCode = GetJniEnv()->GetMethodID();因为 StatusLine::Class 是 NULL。 但!我注意到:如果我在项目的某个 java 文件中写这个 状态线 l = new StatuLine() { ...

函数在 ByteArrayOutputStream::Constructor 上崩溃,因为 ByteArrayOutputStream::Class 是 NULL,如果我在 java 中创建一个 ByteArrayOutputStream 的对象,函数将进一步到下一个对象,等等......我注意到:如果我只是声明一个ByteArrayOutputStream 的变量,findClass 将返回 NULL。

谁能告诉我该怎么做?顺便说一句,我使用 Android 2.3.5 设备 Samsung GT-S5363,我尝试了其他版本的 android(elder)和设备,它工作正常。

最佳答案

基本上,如果您询问 FindClass 的线程不是主线程,并且您的线程系统中没有构建 java 类 ID 的映射,就会发生这种情况。

检查一下,可能您必须先在主线程中询问 FindClass(当 JNI 加载时或其他地方),然后您就可以在任何线程中执行此操作。

http://discuss.cocos2d-x.org/t/jni-findclass-cannot-find-a-class-if-its-called-by-a-new-pthread/1873/4

也试试这个,这对我有用: https://svn.apache.org/repos/asf/mesos/branches/0.10.x/src/java/jni/convert.cpp

解决方案(取自上面的链接)是在 JNI_OnLoad 中从您的应用程序中找到一个 Java 类加载器,然后让他从任何线程中找到类。否则,在调用 env->FindClass 之后,JNI 可以回退到系统类加载器,它只加载像 String 这样的系统类。

关于java - Jni FindClass 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26100902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com