Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111395
  • 博文数量: 187
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1383
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-16 19:22
  • 认证徽章:
文章分类

全部博文(187)

文章存档

2017年(116)

2016年(71)

我的朋友

分类: LINUX

2017-03-16 21:16:20

native 代码中数据类型的转换 :http://blog.csdn.net/jinhill/article/details/6918821

数据类型转换时,c 和c++的差异之 env : http://blog.csdn.net/liranke/article/details/41206491

String ,String[] 类型的转换 等:

这里有 String[] 的转换 ,在native 代码中为 jobjectArray 类型

点击(此处)折叠或打开

  1. JNIEXPORT jint JNICALL Java_xuijar_Xui_open
  2.   (JNIEnv * env, jclass cls, jobjectArray objary)
  3. {
  4.         char * argv[MAX_STRARRAY_LEN];
  5.         int argc = (*env)->GetArrayLength(env,objary);

  6.         int i;
  7.         jstring js;
  8.         for( i=0; i<argc && i < MAX_STRARRAY_LEN; i++ ){
  9.                 js = (jstring)(*env)->GetObjectArrayElement(env,objary,i);
  10.                 argv[i] = (char *)(*env)->GetStringUTFChars(env,js,0);
  11.         }

  12.         argc = i;

  13.         return XuiOpen(argc,argv);
  14. }

下面这是String 的转换,在native代码中对应 jstring :

点击(此处)折叠或打开

  1. JNIEXPORT jlong JNICALL Java_xuijar_Xui_createFont
  2.   (JNIEnv * env, jclass cls, jstring fontfile, jint index, jint fontset)
  3. {
  4.         char * cstrfontfile = (char *)(*env)->GetStringUTFChars(env,fontfile,0);
  5.         return XuiCreateFont(cstrfontfile, index, fontset);
  6. }
下面是 unsigned int 类型的转换(java没有unsigned 类型,要用更长的signed类型替换,比如用signed long 型替换 unsigned int型):

点击(此处)折叠或打开

  1. JNIEXPORT jint JNICALL Java_xuijar_Xui_canvasDrawText
  2.   (JNIEnv * env, jclass cls, jlong window, jlong x, jlong y, jlong height, jlong font, jint textstyle, jint fg, jstring text)
  3. {
  4.         long ux = x & (0xFFFFFFFF);
  5.         long uy = y & (0xFFFFFFFF);
  6.         long uheight = height & (0xFFFFFFFF);
  7.         XuiColor fgcolor;
  8.         fgcolor.b = fg & 0xFF;
  9.         fgcolor.g = (fg >> 8) & 0xFF;
  10.         fgcolor.r = (fg >> 16)& 0xFF;
  11.         fgcolor.a = (fg >> 24)& 0xFF;
  12.         const char * cstrtext = ( char * )(*env)->GetStringUTFChars(env,text,0);
  13.         return XuiCanvasDrawText(window,ux,uy,uheight,font,textstyle,fgcolor,cstrtext);
  14. }

类型对照可以在官方文档中查到
官方文档 : http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp1242

编写native 接口类,大概就这样(文件N.java):

点击(此处)折叠或打开

  1. package abc;


  2. public class N{

  3.     
  4.         static{
  5.                 System.loadLibrary("jni_libxxx");
  6.         }


  7.         public static native int open(String[] args);

  8.         public static native void close();
  9. }
然后编写调用native接口的测试程序(Test.java):

点击(此处)折叠或打开

  1. package abc;

  2. public class Test {

  3.         public static void main(String[] args){
  4.                 N.open(args);
  5.                
  6.                 N.close();
  7.                 while(true);
  8.         }
  9. }

先根据如下步骤(命令行执行):

1、创建工程目录和java代码,代码中要包含相关load代
2、javac 编译java代码,要在工程目录外执行
3、javah 生成头文件,javah -classpath [your project dir] -jni  包名.类名  ,
4、根据头文件中代码的声明,编写native 代码
5、native代码生成动态链接库(linux下) ,示例: gcc jnilib.c -fPIC -shared -o libjnilib.so ,注意.so的名字要加上lib前缀,便于链接
6、运行,javah -classpath [your project dir]  包名.类名

编译生成了 N.class ,头文件, libjni_libxxx.so 

在编译Test.java时报错,错误原因未解(可能是因为不在一个工程中)
后来在Eclipse中编译Test.java 成功
在Eclipse中编译步骤:




Launch configuration ,在选的时候会有若干个选项,选和你这个工程有关的
Export destination,是jar包的导出目录。

动态库在 类 N 中动态加载,Test类不需要再加载,生成的Jar可以直接在虚拟机上运行了。

运行 jar包, jamvm -jar xxx.jar   (jamvm是虚拟机,用你自己的虚拟机)
参考 : http://blog.csdn.net/u010511175/article/details/11109739
阅读(1200) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册