文档章节

Linux下JNI实现

素人派
 素人派
发布于 2015/07/22 07:55
字数 386
阅读 7
收藏 0
在Linux下实现JNI的一个例子,实验环境为:Ubuntu 11.10,open-jdk-6,gcc 4.6.1
1.编写调用jni的java类:
public class Hello{
public native void hi();
public native int getInt();
public native String getStr();
public native Person getPerson();
static {
System.loadLibrary("hi");
}
public static void main(String[] args){
Hello hello = new Hello();
hello.hi(); System.out.println(hello.getInt());
System.out.println(hello.getStr());
System.out.println(hello.getPerson().name);
}
class Person{
public String name;
}
}
2.使用javac来编译java类
javac -classpath . Hello.java
3.使用javah来生成C程序对应的头文件Hello.h
javah -classpath . Hello
4.用C语言编写实现hi函数的代码
#include <stdio.h>
#include <jni.h>
#include "Hello.h"
JNIEXPORT void JNICALL Java_Hello_hi(JNIEnv *env, jobject obj){
printf("hi, boy!\n");
}
JNIEXPORT jint JNICALL Java_Hello_getInt(JNIEnv *env, jobject obj){
printf("c return int.\n");
return 123;
}
JNIEXPORT jstring JNICALL Java_Hello_getStr(JNIEnv *env, jobject obj){
printf("c return string.\n");
return (*env)->NewStringUTF(env, "Hello world.");
}
JNIEXPORT jobject JNICALL Java_Hello_getPerson(JNIEnv *env, jobject obj){
printf("c return person.\n");
jclass p_cls = (*env)->FindClass(env, "Person");
jfieldID p_fid_name_id = (*env)->GetFieldID(env, p_cls, "name", "Ljava/lang/String;");
jmethodID p_con_id = (*env)->GetMethodID(env, p_cls, "<init>", "()V");
jobject p = (*env)->NewObject(env, p_cls, p_con_id);
(*env)->SetObjectField(env, p, p_fid_name_id, (*env)->NewStringUTF(env, "Mark"));
return p;
}
5.编译生成Linux下的动态链接库文件libhi.so
gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -fPIC -shared hi.c -o libhi.so
6.最后运行命令验证是否成功(输出"hi, boy!")
java -Djava.library.path=. -classpath . Hello
javap -s java.lang.String
Exception in thread "main" java.lang.UnsatisfiedLinkError: Hello.hi()V
如果在Windows下用gcc编译需要加额外的参数gcc -Wl,--kill-at -shared -hi.c -o hi.dll
如果在64位系统上编译so库的话,需要在configure的时候加参数:
CFLAGS="-O3 -fPIC" ./configure
参考资料:
如何在Windows环境下使用Eclipse(CDT)来查看C源代码,需要添加如下环境变量
LIBRARY=
C_INCLUDE_PATH=

本文转载自:http://surenpi.com/2014/10/30/linux%e4%b8%8bjni%e5%ae%9e%e7%8e%b0/

共有 人打赏支持
上一篇: Struts2零配置
下一篇: 继电器
素人派
粉丝 24
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
ndk编译opencl出现问题,大家来讨论一下

D:/utils/android-ndk-r9d/toolchains/x86-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld.exe: warning: skipping incompatib......

冰冻流星
2016/08/10
420
0
android JNI 使用 for mac

使用jni实现Java调用C代码,步骤: 1,下载ndk,链接:http://developer.android.com/tools/sdk/ndk/index.html;解压 , 2,如果是windows系统,需要安装Cygwin工具,这是window下模拟Linux...

宇宙执政
2014/01/03
0
4
android studio 移植 ffmpeg

android进行ffmpeg的移植操作,,首先准备工作是编译ffmpeg的源码生成静态库。这里在linux环境下编译,下载以后解压,然后准备ndk就行了。 ffmpeg 下载地址https://ffmpeg.org/download.htm...

spinchao
2016/10/28
0
0
命令行下编译 HelloJni

1)启动 Cygwin 进入 NDK目录 2)执行 ndk-build 生成 so 文件,过程如下: Administrator@PC-201111101325 ~ $ cd $NDK Administrator@PC-201111101325 /cygdrive/d/android-ndk-r7 $ cd sa......

长平狐
2012/08/29
243
0
ubuntu 12.04上安装eclipse后不能正常启动

ubuntu 12.04上反复安装不同版本的eclipse(安装卸载),最后通过命令apt-get install eclipse安装(此时安装的eclipse为3.7版本的),在usr/lib/eclipse中打开时不能正常启动,报: An err...

狼行-狼行
2014/06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

dockerfile 镜像构建(1)

通用dockerfile 利用已经编译好的.jar 来构建镜像。要构建的目录如下: [root@iZuf61quxhnlk9m2tkx16cZ demo_jar]# docker build -t demo:1 . 运行镜像: [root@iZuf61quxhnlk9m2tkx16cZ de...

Canaan_
30分钟前
1
0
Redis radix tree源码解析

Redis实现了不定长压缩前缀的radix tree,用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radix tree。 核心数据结构 raxNode是radix tree的核心数据结构,其结构体...

阿里云云栖社区
33分钟前
7
0
vue import 传入变量

在做动态添加component的时候,传入变量就会报错,出现以下错误信息: vue-router.esm.js?fe87:1921 Error: Cannot find module '@/components/index'. at eval (eval at ./src/components ......

朝如青丝暮成雪
35分钟前
1
0
Flutter开发 Dio拦截器实现token验证过期的功能

前言: 之前分享过在Android中使用Retrofit实现token失效刷新的处理方案,现在Flutter项目也有“token验证过期”的需求,所以接下来我简单总结一下在Flutter项目中如何实现自动刷新token并重...

EmilyWu
36分钟前
7
0
final Map可以修改内容,final 常量不能修改

1.final Map 可以put元素,但是不可以重新赋值 如: final Map map = new HashMap(); map = new HashMap();//不可以 因为栈中变量map引用地址不能修改 2.final str = “aa”; str = "bb";/......

qimh
39分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部