Java Can';编译JNI C不兼容的指针类型
我正在编写一些本机代码,以便将RPI sense帽子与我的java内容进行接口,但我无法让我的本机代码暗示。我已经用java编写了存根,对其进行编译,然后使用javah提取头文件。我在C中创建了一些方法,将一个简单的字符数组转换成字符串以返回。我似乎无法编译它。 爪哇: 头文件:Java Can';编译JNI C不兼容的指针类型,java,c,gcc,java-native-interface,native,Java,C,Gcc,Java Native Interface,Native,我正在编写一些本机代码,以便将RPI sense帽子与我的java内容进行接口,但我无法让我的本机代码暗示。我已经用java编写了存根,对其进行编译,然后使用javah提取头文件。我在C中创建了一些方法,将一个简单的字符数组转换成字符串以返回。我似乎无法编译它。 爪哇: 头文件: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class SenseHat */
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SenseHat */
#ifndef _Included_SenseHat
#define _Included_SenseHat
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: SenseHat
* Method: getTemperature
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_SenseHat_getTemperature
(JNIEnv *, jobject);
/*
* Class: SenseHat
* Method: getHumidity
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_SenseHat_getHumidity
(JNIEnv *, jobject);
/*
* Class: SenseHat
* Method: getOrientation
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_SenseHat_getOrientation
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
你做不到
char done[] = "temperature";
/* ... */
answer = (*env)->NewStringUTF(env,&done);
/* --^-- & is redundant */
应该是
char done[] = "temperature";
/* ... */
answer = (*env)->NewStringUTF(env,done);
甚至
answer = (*env)->NewStringUTF(env,"temperature");
你也不应该免费(完成)
。此内存未分配给malloc()
,因此释放将导致未定义的行为。您不能这样做
char done[] = "temperature";
/* ... */
answer = (*env)->NewStringUTF(env,&done);
/* --^-- & is redundant */
应该是
char done[] = "temperature";
/* ... */
answer = (*env)->NewStringUTF(env,done);
甚至
answer = (*env)->NewStringUTF(env,"temperature");
你也不应该
免费(完成)
。此内存未分配给malloc()
,因此释放会导致未定义的行为。我看到的第一个问题是:声明局部数组变量并对其使用free()。要么使用malloc()/free(),要么在本地声明数组,但不要将两者混合使用。我看到的第一个问题是:声明本地数组变量并对其使用free()。可以使用malloc()/free()或在本地声明数组,但不要将两者混合使用。可以提供编译器输出吗?可以提供编译器输出吗?不能<代码>NewStringUTF(env,&done)代码>不正确<代码>数组和数组
都是正确的,它们的计算结果都是数组的第一个元素的地址。尝试编写一些代码,以发出array
和&array
的结果,例如printf(“%p\n%p\n”,done,&done)代码>。打印的两个地址将是相同的。问题中发布的代码的问题是免费(完成)代码>行。@AndrewHenle无论指针指向同一个内存位置,它们都有完全不同且不兼容的类型<代码>完成
是字符*
和完成
是字符(*)[]
。函数具有下一个原型jstringnewstringutf(JNIEnv*env,constchar*bytes)代码>所以&done
是不可接受的参数,编译器会告诉你这一点。你不能<代码>NewStringUTF(env,&done)代码>不正确<代码>数组
和数组
都是正确的,它们的计算结果都是数组
的第一个元素的地址。尝试编写一些代码,以发出array
和&array
的结果,例如printf(“%p\n%p\n”,done,&done)代码>。打印的两个地址将是相同的。问题中发布的代码的问题是免费(完成)代码>行。@AndrewHenle无论指针指向同一个内存位置,它们都有完全不同且不兼容的类型<代码>完成
是字符*
和完成
是字符(*)[]
。函数具有下一个原型jstringnewstringutf(JNIEnv*env,constchar*bytes)
所以&done
是不可接受的参数,编译器会告诉您这一点。