Chinaunix首页 | 论坛 | 博客
  • 博客访问: 282995
  • 博文数量: 124
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 21
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-20 14:44
文章分类

全部博文(124)

文章存档

2020年(1)

2018年(2)

2016年(2)

2015年(6)

2014年(10)

2013年(23)

2012年(7)

2011年(18)

2010年(15)

2009年(8)

2007年(8)

2006年(23)

2005年(1)

我的朋友

分类: Java

2013-07-24 09:26:39

偶尔写jni,每次都要查步骤。此次记录下来以供参考;
目录结构如下:
  1. 工程路径/tmp/java
  2. 其他src为元未见目录;
  3. bin为可执行目录,bin/classes为class目录;
  4. jni为程序目录;
  5. mkdir创建相应的目录;
创建com.example.Main.java文件;

点击(此处)折叠或打开

  1. package com.example;

  2. public class Main{
  3.     static {
  4.         System.loadLibrary("time");
  5.     }
  6.     public native long getTime(long time);
  7.     public static void main(String []args){
  8.         Main m=new Main();
  9.         System.out.println(m.getTime(System.currentTimeMillis()));
  10.     }
  11. }

编译java文件,生成class;
在工程目录下运行:javac  -d bin/classes src/com/example/Main.java 会在bin/classes目录下产生com.example.Main.class文件;

运行javah,产生头文件;
javah -d jni -classpath bin/classes com.example.Main

在jni目录下,编辑a.c文件,实现native方法;

点击(此处)折叠或打开

  1. #include"com_example_Main.h"
  2. #include <sys/time.h>
  3. #include
  4. JNIEXPORT jlong JNICALL Java_com_example_Main_getTime
  5.   (JNIEnv * a, jobject b, jlong i){
  6.     struct timeval tv;
  7.     gettimeofday(&tv,0);
  8.     printf("i=%ld\tt=%ld\n",i,tv.tv_sec*1000+tv.tv_usec/1000);
  9.     return tv.tv_sec*1000;
  10. }
编译a.c,生成libtime.so;
gcc -fpic -o ../bin/libtime.so -shared  -I/opt/jdk1.6.0_38/include -I/opt/jdk1.6.0_38/include/linux  *.c

到bin目录下运行java文件;
LD_LIBRARY_PATH=.  java -cp classes com.example.Main

从结果可以看出,其中打印出了正确的时间值。 不过很奇怪,把这段代码用到android中。long值就打不出了。



在安桌系统中需要如下写:

点击(此处)折叠或打开

  1. VERSION=4.7
  2. NDK_ROOT=/opt/google/android/android-ndk-r8e
  3. TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-$(VERSION)/prebuilt/linux-x86_64
  4. TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
  5. TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/$(VERSION)/include-fixed

  6. SYSROOT=$(NDK_ROOT)/platforms/android-9/arch-arm
  7. PLATFORM_INCLUDE=$(SYSROOT)/usr/include
  8. PLATFORM_LIB=$(SYSROOT)/usr/lib

  9. FLAGS= -fpic -DANDROID 
  10. #如果没有-lc,实际运行时会找不到gettimeofday;
  11. LDFLAGS=-shared -L$(PLATFORM_LIB) -lc #-nostdlib -ldl -lm -Bdynamic -lc -lstdc++ #其中加入--no-undefined可以检查是否有函数没有被定义
  12. #FLAGS="-I$(TOOLCHAINS_INCLUDE) -I$(PLATFORM_INCLUDE) " #-L$(PLATFORM_LIB) -nostdlib -lgcc -Bdynamic -lc"
  13. CC=$(TOOLCHAINS_PREFIX)-gcc --sysroot=$(SYSROOT)
  14. LD=$(TOOLCHAINS_PREFIX)-ld


  15. libtime.so: main.o
  16. $(LD) $(LDFLAGS) main.o -o libtime.so
  17. cp libtime.so ../libs/armeabi
  18. main.o: main.c
  19. $(CC) -c main.c -o main.o
  20. clean:
  21. rm -rf libtime.so
  22. rm main.o


阅读(1314) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~