[关闭]
@cyysu 2017-09-04T09:51:01.000000Z 字数 2425 阅读 1054

OSGI框架通过JNI调用底层

  • 时间:2017年9月4日
  • 作者:MJ_DZ chen yuan
  • 邮箱:chenyuan@ypmingjiang.cn
  • 描述:OSGI框架通过JNI调用底层
  • 版本:V2.0

开篇的话

  1. 关于OSGI的简介以及JNI的简介我这里就不介绍了,可以看之前的文章。本文的主要内容为在OSGI框架中通过JNI调用底层C实现的代码。

环境准备

  1. 1. Eclipse Version: 3.4.0(这款软件需要配置CDT工具,具备CJava的开发环境),具体的链接可以在之前的文章进行查看。

搭建过程

No.1 native方法定义

  1. package mj;
  2. /**
  3. * @ClassName: TestJNIDemo
  4. * @Description: Java JNI Declaration Class
  5. * @author: MJ_DZ chenyuan
  6. * @date 2017-9-2 上午11:08:10
  7. * @version V1.0
  8. */
  9. public class TestJNIDemo {
  10. static {
  11. System.loadLibrary("Hello");
  12. }
  13. public native static void test();
  14. }

No.2 相关.h文件生成

  1. # 下面的代码为自动生成,本Eclipse配置了自己的命令,选中相关java文件,点击运行即可完成.h文件生成。
  2. /* DO NOT EDIT THIS FILE - it is machine generated */
  3. #include <jni.h>
  4. /* Header for class mj_TestJNIDemo */
  5. #ifndef _Included_mj_TestJNIDemo
  6. #define _Included_mj_TestJNIDemo
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. /*
  11. * Class: mj_TestJNIDemo
  12. * Method: test
  13. * Signature: ()V
  14. */
  15. JNIEXPORT void JNICALL Java_mj_TestJNIDemo_test
  16. (JNIEnv *, jclass);
  17. #ifdef __cplusplus
  18. }
  19. #endif
  20. #endif

No.3 建立C工程实现so文件生成

  1. #将上面的.h文件放到我们的C工程中,然后编写对应的.c文件。
  2. #include "mj_Demo.h"
  3. JNIEXPORT void JNICALL Java_mj_TestJNIDemo_test(JNIEnv *env, jobject object)
  4. {
  5. printf("Hello JNI");
  6. }
  7. # 如果上面的步骤出现.h错误,找不到jni.h,我们需要在工程的 Properties中选择Settings选中我们的jdk中的include目录和include目录下的linux目录

No.4 生成so文件

  1. 由于本Eclipse配置好了编译操作,直接build configuration选择build all 就可完成编译

No.5 建立OSGI工程

  1. package demo;
  2. import org.osgi.framework.BundleActivator;
  3. public class Activator implements BundleActivator {
  4. /*
  5. * (non-Javadoc)
  6. * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
  7. */
  8. public void start(BundleContext context) throws Exception {
  9. System.loadLibrary("Hello");
  10. System.out.println("Hello World!!");
  11. }
  12. /*
  13. * (non-Javadoc)
  14. * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
  15. */
  16. public void stop(BundleContext context) throws Exception {
  17. System.out.println("Goodbye World!!");
  18. }
  19. }

No.6 修改MANIFEST.MF文件

  1. #文件末尾一定要留出空一行,相关注意事项前文已经介绍过了。
  2. #Bundle-NativeCode 就是说osgi调用底层native代码的,第一个路径为相对路径,所以在工程目录下建立一个lib文件夹。
  3. Manifest-Version: 1.0
  4. Bundle-ManifestVersion: 2
  5. Bundle-Name: Demo Plug-in
  6. Bundle-SymbolicName: Demo
  7. Bundle-Version: 1.0.0
  8. Bundle-Activator: demo.Activator
  9. Bundle-Vendor: cyysu
  10. Bundle-NativeCode: lib/libHello.so;osname=linux;processor=x86-64,*
  11. Bundle-RequiredExecutionEnvironment: J2SE-1.4
  12. Import-Package: org.osgi.framework;version="1.3.0"

No.7 结果显示

  1. osgi> Hello World!!
  2. osgi> ss
  3. Framework is launched.
  4. id State Bundle
  5. 0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
  6. 2 ACTIVE org.apache.commons.logging_1.0.4.v20080605-1930
  7. 24 ACTIVE org.eclipse.core.commands_3.4.0.I20080509-2000
  8. 25 ACTIVE org.eclipse.equinox.common_3.4.0.v20080421-2006
  9. 45 ACTIVE Demo_1.0.0
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注