Java JNI使用之将JAVA的 String[ ] 字符串数组转化成C语言的 char**

简介:

   用java直接调用c里面的main(int argc,*char[] argv),那么在java层面上,就需要使用String[]字符串数组,然后将String[]转化成C语言的char**。

   根据前面的文章,制作调用JNI的C头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_xmu_engine_HTK */
                                                                                                                                                                                   
#ifndef _Included_com_xmu_engine_HTK
#define _Included_com_xmu_engine_HTK
#ifdef __cplusplus
extern  "C"  {
#endif
/*
  * Class:     com_xmu_engine_HTK
  * Method:    HCopy
  * Signature: ([Ljava/lang/String;)[Ljava/lang/String;
  */
JNIEXPORT jobjectArray JNICALL Java_com_xmu_engine_HTK_HCopy
   (JNIEnv *, jclass, jobjectArray);
/*
  * Class:     com_xmu_engine_HTK
  * Method:    HVite
  * Signature: ([Ljava/lang/String;)V
  */
JNIEXPORT  void  JNICALL Java_com_xmu_engine_HTK_HVite
   (JNIEnv *, jclass, jobjectArray);
                                                                                                                                                                                   
/*
  * Class:     com_xmu_engine_HTK
  * Method:    HParse
  * Signature: ([Ljava/lang/String;)V
  */
JNIEXPORT  void  JNICALL Java_com_xmu_engine_HTK_HParse
   (JNIEnv *, jclass, jobjectArray);
                                                                                                                                                                                   
#ifdef __cplusplus
}
#endif
#endif


   我们看到,jobjectArray就是C的jni定义的String字符串数组。这三个函数在java中的声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
package  com.xmu.engine;
                                                                
public  class  HTK {
     public  static  native  void  HCopy(String args[]);
                                                                
     public  static  native  void  HVite(String args[]);
                                                                
     public  static  native  void  HParse(String args[]);
                                                                
     static  {
         System.loadLibrary( "htkengine" );
     }
}


   下面,重点来看看怎样将JAVA String[]转化按成C的char**(看其中的HVite如何实现,其余两个类似):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
  * Class:     com_xmu_engine_HTK
  * Method:    HVite
  * Signature: ()V
  */
JNIEXPORT  void  JNICALL Java_com_xmu_engine_HTK_HVite
     (JNIEnv * env, jclass jc,jobjectArray strArray ){
     jstring jstr;
     jsize len = (*env)->GetArrayLength(env, strArray);
     char  **pstr = ( char  **)  malloc (len* sizeof ( char  *));
             
     int  i=0;
            
     for  (i=0 ; i<len; i++) {
         jstr = (*env)->GetObjectArrayElement(env, strArray, i);
         pstr[i] = ( char  *)(*env)->GetStringUTFChars(env, jstr, 0);           
               
         }    
            
     HVite(len,pstr);
            
}


   代码应该很清楚,不再详细解释了。










本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1378277,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
273 5
|
3月前
|
存储 SQL 缓存
Java字符串处理:String、StringBuilder与StringBuffer
本文深入解析Java中String、StringBuilder和StringBuffer的核心区别与使用场景。涵盖字符串不可变性、常量池、intern方法、可变字符串构建器的扩容机制及线程安全实现。通过性能测试对比三者差异,并提供最佳实践与高频面试问题解析,助你掌握Java字符串处理精髓。
|
4月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
339 14
|
4月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
314 15
|
8月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
240 11
|
8月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
259 9
|
9月前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
503 0
一文彻底搞明白C语言的数组
|
11月前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
178 2
Java 中的 String Pool 简介
|
11月前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
286 1
java 为什么 String 在 java 中是不可变的?