Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163964
  • 博文数量: 18
  • 博客积分: 299
  • 博客等级: 二等列兵
  • 技术积分: 731
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-19 00:39
文章分类

全部博文(18)

文章存档

2013年(7)

2012年(11)

分类: 嵌入式

2012-06-13 11:07:07

调用的jdkandroid 2.1源码下的 jdk1.5.0_22的文件夹

静态方式:

 

1,首先,在android根目录建立test 目录,test目录下再建立test目录,进入

2,进入test目录后vim HelloWorld.java


点击(此处)折叠或打开

  1. HelloWorld.java:

  2. package test;

  3. public class HelloWorld

  4. {

  5. public static void main(String[] args)

  6. {

  7. System.loadLibrary("HelloWorld");

  8. printHello();

  9. }

  10. public static native final void printHello();

  11. }

3,退出test目录,键入命令:../jdk1.5.0_22/bin/javac test/HelloWorld.javatest目录下将生成HelloWorld.class

4,键入../jdk1.5.0_22/bin/javah -o test/Hello.h test.HelloWorldtest目录下将生成Hello.h

5,在test目录下创建HelloWorld.cpp文件


点击(此处)折叠或打开

  1. HelloWorld.cpp:

  2. #include "Hello.h"

  3. #include <cstdio>

  4. Void Java_test_HelloWorld_printHello(JNIEnv *, jclass)

  5. {

  6.     printf("helloworld");

  7. }

6,退出test目录,键入 g++ test/HelloWorld.cpp -I ../jdk1.5.0_22/include/ -I ../jdk1.5.0_22/include/linux/ -fPIC -shared -o test/libHelloWorld.so test目录下将会生成libHelloWorld.so

7,运行../jdk1.5.0_22/bin/java test.HelloWorld 屏幕上会打印出helloworld.

 

出错情况:

1,如果g++ test/HelloWorld.cpp -I ../jdk1.5.0_22/include/ -fPIC -shared -o test/libHelloWorld.so 虽然jni.h../jdk1.5.0_22/include/,但是如果不加上这边的目录-I ../jdk1.5.0_22/include/linux/的话,还是会报一大堆错误的。

2,如果运行的时候../jdk1.5.0_22/bin/java test.HelloWorld

java.lang.UnsatisfiedLinkError: no HelloWorld in library path

         at java.lang.Runtime.loadLibrary(Runtime.java)

         at java.lang.System.loadLibrary(System.java)

         at HelloWorld.main(HelloWorld.java)

类似的错误,那么就是因为LD_LIBRARY_PATH没有设置正确,用

LD_LIBRARY_PATH=test

 export LD_LIBRARY_PATH

在运行一下就可以了。

参考自:

 动态方式:

关于动态方式,java上层的调用和静态方式是相同的,关键是native层的调用有所不同,主要关键在于三个地方:

1,  定义调用的JNINativeMethod

2,  定义调用挂钩的函数

3,  实现JNI_OnLoad函数

JNI_OnLoadjava jni技术的一个实现,每次java层加载System.loadLibrary之后,自动会查找改库一个叫JNI_OnLoad的函数,动态注册的时候,cpp可以通过实现JNI_OnLoad而完成jni的动态注册。

 

1,建立dynamic文件夹,进入,把静态连接的HelloWorld.java拷贝进来,并且修改package test;package dynamic;

2,建立HelloWorld.cpp

 


点击(此处)折叠或打开

  1. #include "jni.h"

  2. #include <cstdio>

  3. // java转到native层的对应函数

  4. static int android_print(JNIEnv * env, jclass clazz)

  5. {

  6.     printf("helloworld");

  7. }


  8. // 结构体,分别是java层的函数名称,签名,对应的函数指针

  9. static JNINativeMethod gMethods[] =

  10. {

  11.     {"printHello", "()V", (void*)android_print},

  12. };

  13. // JNI_OnLoad函数实现

  14. jint JNI_OnLoad(JavaVM* vm, void* reserved)

  15. {

  16.    

  17.     JNIEnv* env = NULL;

  18.     jint result = -1;

  19.  

  20.     if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {

  21.         return -1;

  22. }

  23. //如果要注册,只需要2不,首先FindClass,然后RegisterNatives就可以了

  24.     char className[20] = {"dynamic/HelloWorld"};

  25.     jclass clazz = (env)->FindClass( (const char*)className);

  26.     if((env)->RegisterNatives(clazz, gMethods, 1)< 0)

  27.     {

  28.         return -1;

  29. }

  30. //一定要返回版本号,否则会出错。

  31.     result = JNI_VERSION_1_4;

  32.    

  33.         return result;

  34. }

然后编译一下:

编译java

../jdk1.5.0_22/bin/javac dynamic/HelloWorld.java

编译cpp生成.so

g++ dynamic/HelloWorld.cpp -I ../jdk1.5.0_22/include/ -I ../jdk1.5.0_22/include/linux/ -fPIC -shared -o dynamic /libHelloWorld.so dynamic目录下将会生成libHelloWorld.so

设置LD_LIBRARY_PATH环境变脸

运行Java

../jdk1.5.0_22/bin/java dynamic.HelloWorld 屏幕上会打印出helloworld

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