Java Can';编译JNI 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 */

我正在编写一些本机代码,以便将RPI sense帽子与我的java内容进行接口,但我无法让我的本机代码暗示。我已经用java编写了存根,对其进行编译,然后使用javah提取头文件。我在C中创建了一些方法,将一个简单的字符数组转换成字符串以返回。我似乎无法编译它。 爪哇:

头文件:

/* 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
是不可接受的参数,编译器会告诉您这一点。