现在的位置: 首页 > 综合 > 正文

android jni 基本数据类型 类 复杂数据类型 ArrayList

2013年10月08日 ⁄ 综合 ⁄ 共 1812字 ⁄ 字号 评论关闭

转自:http://blog.csdn.net/u_xtian/article/details/6033963

我们知道Java是一个运行在虚拟机里面的高级的编程语言,如果要调用系统的动态链接库的话,就要先声明native修饰的方法(类似接口里面的方法),再由C/C++程序来实现(类似实现接口里的方法)。这样Java调用这些native方法就相当于调用了C/C++里面实现了的方法。通常我们把这种机制叫做JNI(Java
NativeInterfac),即Java 本地编程接口


          Android也同理,要学会在Android上进行NDK开发,首先我们到打好java JNI的基础。现在我们暂时把Android开发丢到一边先,试试在Java之下编译一个C动态链接库,再用Java程序调用。

 

1)先来个最简单的打印HelloWorld例子:

Java代码(HelloJni.java)

[java] view
plain
copy

  1. import java.util.*;  
  2. public class HelloJni{  
  3.       
  4.     static{  
  5.         System.loadLibrary("hello");  
  6.     }  
  7.     public native static void sayHello();  
  8.     public static void main(String [] args)  
  9.     {  
  10.                 HelloJni.sayHello();  
  11.     }  
  12. }  

 

生成头文件(HelloJni.h):

javac HelloJni.java编译你的Java源码,再javah–jni HelloJni生成所需的头文件

头文件内容是这样的:

[java] view
plain
copy

  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class HelloJni */  
  4. #ifndef _Included_HelloJni  
  5. #define _Included_HelloJni  
  6. #ifdef __cplusplus  
  7. extern "C" {  
  8. #endif  
  9. JNIEXPORT void JNICALL Java_HelloJni_sayHello (JNIEnv *, jclass);  
  10. #ifdef __cplusplus  
  11. }  
  12. #endif  
  13. #endif  

 


实现头文件声明的方法(HelloJni.cpp)


[c-sharp] view
plain
copy

  1. #include "HelloJni.h"  
  2. JNIEXPORT void JNICALL Java_HelloJni_sayHello(JNIEnv *env, jclass cls)  
  3. {  
  4.        printf("HelloWorld");  
  5. }  

 

 

编译命令g++ -I$JAVA_HOME/include-I$JAVA_HOME/include/linux HelloJni.cpp -shared -o libhello.so

命令参数解析:-I 是指引入java虚拟机的库的路径,-shared 是指编译成动态链接库(共享库) –o 输出文件名(注意,在Linux平台下的动态链接库有一个命名格式:“lib+库名+.so”在java代码里面loadLibrary的时候不要加lib前缀和.so后缀)

由于我这里把这个动态链接库编译放在当前目录下,所以还要设置环境变量LD_LIBRARY_PATH=so动态链接库所在的目录,才能正常运行

 

#############################+++华丽的分割线+++###########################

2)好了,可以打印HelloWorld出来后,我们再深入一点点,传入一个int的数,在C/C++代码里面加1后返回。

 

Java代码(HelloJni.java)

[java] view
plain
copy

  1. public class HelloJni{  
  2.         static{  
  3.                    System.loadLibrary("hello");  

抱歉!评论已关闭.