调用VoidMethod jni中的SIGSEGV
SIGSEGV in CallVoidMethod jni
我有一个带有一些jni本机方法的java应用程序。其中之一是readFile,它的名称如下:
OutputStream outStream = null;
File file = new File("Alf.txt");
try {
outStream = new FileOutputStream(file);
myObject.readFile("TestFile.txt",outStream);
...
在我的jni实现中,我做:
JNIEXPORT jint JNICALL Java_com_example_mylib_SomeClass_readFile
(JNIEnv *env, jclass, jstring java_string, jobject stream) {
jclass classOutputStream = env->FindClass("java/io/OutputStream");
if (classOutputStream == NULL)
{
Log::err("classOutputStream == NULL;");
return -1;
}
jmethodID OutputStream_write_ID = env->GetMethodID(classOutputStream, "write", "([BII)V");
if (OutputStream_write_ID == NULL)
{
return -1;
}
char* buf = "hello";
env->CallVoidMethod((jobject)stream, OutputStream_write_ID,buf,0,5);
当我调用CallVoidMethod时,我会得到
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f4a85a5e1e1, pid=25597, tid=139958068348672
#
# JRE version: Java(TM) SE Runtime Environment (8.0_25-b17) (build 1.8.0_25-b17)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V [libjvm.so+0x6ad1e1] jni_GetArrayLength+0xb1
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /.../hs_err_pid25597.log
我检查了-没有变量==为NULL,我做错了什么?
C字符数组不能与Java字节数组对象互换——创建和复制数据需要一些工作。
int len = strlen(buf);
jbyteArray arr = (*env)->NewByteArray(env, len);
(*env)->SetByteArrayRegion(env, arr, 0, len, (jbyte*)buf);
如果你需要一个字符串,那就简单一点:
jstring jString = (*env)->NewStringUTF( env, buf );
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 在Hackerearth上获取运行时错误(SIGSEGV),无法找出代码中的问题
- C++ SDL 中的 SIGSEGV 错误
- SIGSEGV 尝试更改结构 C/C++ 中的字符串时
- Android JNI 中的原生崩溃 SIGSEGV
- 分割错误 (SIGSEGV) 获取数据作为结构向量中的输入时
- SIGSEGV shared_ptr中的无序列图
- 难以跟踪大型程序中的SIGSEGV分段故障
- 子和父C程序中的SIGSEGV处理
- SPOJ上简单动态编程中的SIGSEGV错误
- DSO中的SIGSEGV,混合C/C++
- c++循环中的SIGSEGV和一个非常大的数组
- std::sort中的SIGSEGV,如何缩小它的范围
- 调用VoidMethod jni中的SIGSEGV
- 在代码厨师上获取运行时错误 (SIGSEGV),无法找出代码中的问题
- linux多线程应用程序中的中断会生成SIGSEGV