偶尔写jni,每次都要查步骤。此次记录下来以供参考;
目录结构如下:
-
工程路径/tmp/java
-
其他src为元未见目录;
-
bin为可执行目录,bin/classes为class目录;
-
jni为程序目录;
-
mkdir创建相应的目录;
创建com.example.Main.java文件;
-
package com.example;
-
-
public class Main{
-
static {
-
System.loadLibrary("time");
-
}
-
public native long getTime(long time);
-
public static void main(String []args){
-
Main m=new Main();
-
System.out.println(m.getTime(System.currentTimeMillis()));
-
}
-
}
编译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方法;
-
#include"com_example_Main.h"
-
#include <sys/time.h>
-
#include
-
JNIEXPORT jlong JNICALL Java_com_example_Main_getTime
-
(JNIEnv * a, jobject b, jlong i){
-
struct timeval tv;
-
gettimeofday(&tv,0);
-
printf("i=%ld\tt=%ld\n",i,tv.tv_sec*1000+tv.tv_usec/1000);
-
return tv.tv_sec*1000;
-
}
编译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值就打不出了。
在安桌系统中需要如下写:
-
VERSION=4.7
-
NDK_ROOT=/opt/google/android/android-ndk-r8e
-
TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-$(VERSION)/prebuilt/linux-x86_64
-
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
-
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/$(VERSION)/include-fixed
-
-
SYSROOT=$(NDK_ROOT)/platforms/android-9/arch-arm
-
PLATFORM_INCLUDE=$(SYSROOT)/usr/include
-
PLATFORM_LIB=$(SYSROOT)/usr/lib
-
-
FLAGS= -fpic -DANDROID
-
#如果没有-lc,实际运行时会找不到gettimeofday;
-
LDFLAGS=-shared -L$(PLATFORM_LIB) -lc #-nostdlib -ldl -lm -Bdynamic -lc -lstdc++ #其中加入--no-undefined可以检查是否有函数没有被定义
-
#FLAGS="-I$(TOOLCHAINS_INCLUDE) -I$(PLATFORM_INCLUDE) " #-L$(PLATFORM_LIB) -nostdlib -lgcc -Bdynamic -lc"
-
CC=$(TOOLCHAINS_PREFIX)-gcc --sysroot=$(SYSROOT)
-
LD=$(TOOLCHAINS_PREFIX)-ld
-
-
-
libtime.so: main.o
-
$(LD) $(LDFLAGS) main.o -o libtime.so
-
cp libtime.so ../libs/armeabi
-
main.o: main.c
-
$(CC) -c main.c -o main.o
-
clean:
-
rm -rf libtime.so
-
rm main.o
阅读(1337) | 评论(0) | 转发(0) |