@cyysu
2017-09-04T09:51:01.000000Z
字数 2425
阅读 1054
- 时间: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 __cplusplus
extern "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.0
Bundle-ManifestVersion: 2
Bundle-Name: Demo Plug-in
Bundle-SymbolicName: Demo
Bundle-Version: 1.0.0
Bundle-Activator: demo.Activator
Bundle-Vendor: cyysu
Bundle-NativeCode: lib/libHello.so;osname=linux;processor=x86-64,*
Bundle-RequiredExecutionEnvironment: J2SE-1.4
Import-Package: org.osgi.framework;version="1.3.0"
No.7 结果显示
osgi> Hello World!!
osgi> ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
2 ACTIVE org.apache.commons.logging_1.0.4.v20080605-1930
24 ACTIVE org.eclipse.core.commands_3.4.0.I20080509-2000
25 ACTIVE org.eclipse.equinox.common_3.4.0.v20080421-2006
45 ACTIVE Demo_1.0.0