@cyysu
2017-09-04T09:51:01.000000Z
字数 2425
阅读 1158
- 时间:2017年9月4日
- 作者:MJ_DZ chen yuan
- 邮箱:chenyuan@ypmingjiang.cn
- 描述:OSGI框架通过JNI调用底层
- 版本:V2.0
关于OSGI的简介以及JNI的简介我这里就不介绍了,可以看之前的文章。本文的主要内容为在OSGI框架中通过JNI调用底层C实现的代码。
1. Eclipse Version: 3.4.0(这款软件需要配置CDT工具,具备C和Java的开发环境),具体的链接可以在之前的文章进行查看。
No.1 native方法定义
package mj;/*** @ClassName: TestJNIDemo* @Description: Java JNI Declaration Class* @author: MJ_DZ chenyuan* @date 2017-9-2 上午11:08:10* @version V1.0*/public class TestJNIDemo {static {System.loadLibrary("Hello");}public native static void test();}
No.2 相关.h文件生成
# 下面的代码为自动生成,本Eclipse配置了自己的命令,选中相关java文件,点击运行即可完成.h文件生成。/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class mj_TestJNIDemo */#ifndef _Included_mj_TestJNIDemo#define _Included_mj_TestJNIDemo#ifdef __cplusplusextern "C" {#endif/** Class: mj_TestJNIDemo* Method: test* Signature: ()V*/JNIEXPORT void JNICALL Java_mj_TestJNIDemo_test(JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif
No.3 建立C工程实现so文件生成
#将上面的.h文件放到我们的C工程中,然后编写对应的.c文件。#include "mj_Demo.h"JNIEXPORT void JNICALL Java_mj_TestJNIDemo_test(JNIEnv *env, jobject object){printf("Hello JNI");}# 如果上面的步骤出现.h错误,找不到jni.h,我们需要在工程的 Properties中选择Settings选中我们的jdk中的include目录和include目录下的linux目录
No.4 生成so文件
由于本Eclipse配置好了编译操作,直接build configuration选择build all 就可完成编译
No.5 建立OSGI工程
package demo;import org.osgi.framework.BundleActivator;public class Activator implements BundleActivator {/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) throws Exception {System.loadLibrary("Hello");System.out.println("Hello World!!");}/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) throws Exception {System.out.println("Goodbye World!!");}}
No.6 修改MANIFEST.MF文件
#文件末尾一定要留出空一行,相关注意事项前文已经介绍过了。#Bundle-NativeCode 就是说osgi调用底层native代码的,第一个路径为相对路径,所以在工程目录下建立一个lib文件夹。Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: Demo Plug-inBundle-SymbolicName: DemoBundle-Version: 1.0.0Bundle-Activator: demo.ActivatorBundle-Vendor: cyysuBundle-NativeCode: lib/libHello.so;osname=linux;processor=x86-64,*Bundle-RequiredExecutionEnvironment: J2SE-1.4Import-Package: org.osgi.framework;version="1.3.0"
No.7 结果显示
osgi> Hello World!!osgi> ssFramework is launched.id State Bundle0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-19002 ACTIVE org.apache.commons.logging_1.0.4.v20080605-193024 ACTIVE org.eclipse.core.commands_3.4.0.I20080509-200025 ACTIVE org.eclipse.equinox.common_3.4.0.v20080421-200645 ACTIVE Demo_1.0.0