java - 在android NDK的java类中调用C函数

标签 java android c android-ndk java-native-interface

我的 NDK 应用程序有一个 c 文件(ht_NDK.c)函数,如下所示,

int heatcon_readtemperature(char* temperature)
   {
    int nret,ok;
    char cmd[3]={'d',0x0d, 0x0a};
    struct pollfd pfd;
    static int i=0;
        char read_temp[255]="banagalore";
    i++;
    memcpy(temperature, &read_temp, i);
    if(i==10)
    i=0;
    return nret;
    }

在另一个 c 文件(second.c)中,我调用上面的函数,如下所示,

jstring
Java_com_example_ndk_ReadData_readData( JNIEnv*  env,
                                      jobject this,jstring printMatter, jint j)
{
   char sz[55] = {0};
   return((*env)->NewStringUTF(env,  heatcon_readtemperature(sz)));       

} 

上面的函数在我的 java 类(ReadData.java)中调用,如下所示

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read_data);       


        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                ReadData rd = new ReadData();
                String n = rd.readData();
                Log.i("NDK", "msg" +n);         
            }
        });

       }

   static
    {
        System.loadLibrary("ht");
        System.out.println("loded library");
    }  


      public native int[] readData();

    }    
}

这样,每当我按下按钮时,值都应该打印在控制台上,一切都很好,但打印的是空值。如何在java类中调用char数据类型。我想我错过了一些东西。如何解决这个问题?

最佳答案

你的第一个函数输出两件事:

  • 它返回一个 int 值(未初始化,您需要修复它)
  • 它修改 char* 参数。

当您创建 java 字符串 (NewStringUTF) 时,您将传递 int 返回值。您可能打算改为传递 char* 值:

char sz[55] = {0};    
heatcon_readtemperature(sz);
return (env*)->NewStringUTF(env, sz);

关于java - 在android NDK的java类中调用C函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13133302/

相关文章:

java - 在 MessageSource 中找不到消息

java - 按钮点击导致应用程序崩溃

android - 在 cocos2dx 的暂停菜单中暂停时无法调用方法

android - GridView 在图像上开始新 Activity 单击

C程序不计算文本文件中的字母频率

c - 在不知道底层算法的情况下如何复制 EVP_PKEY 结构?

c - C 中使用指针的字符串连接

java - 在JavaFx中,如何通过ScrollPane包裹BorderPane

java - 尝试混淆时出现 NoSuchMapping 异常

java - hibernate : An association from the table application_category refers to an unmapped class: allin. beans1.Application