- 最近在Hadoop里要用JNI调一个本地的C程序。
hello world 程序
参考: https://www.cnblogs.com/bastard/archive/2012/05/17/2506877.html
参考的博客内容有点问题。于是重新整理一下。
1. 首先确定安装了JAVA,设置了JAVA_HOME环境变量
2. 创建一个文本文件TestJni.java,内容如下:
public class TestJni
{
//声明原生函数:参数为String类型
public native void print(String content);
//加载本地库代码
static
{
System.loadLibrary("TestJni");
// load native library exclude extension name.
}
}
执行 javac TestJni.java 进行编译,生成TestJni.class文件。
执行javah -jni TestJni 生成 TestJni.h 文件.
TestJni.java中每声明一个函数,使用javah -jni TestJni生成的c语言头文件中就会有一个对应的c语言声明。
- 创建一个TestJni.c 文件,内容如下:
#include <jni.h>
#include <stdio.h>
#include "TestJni.h"
JNIEXPORT void JNICALL
Java_TestJni_print(JNIEnv *env,jobject obj, jstring content)
{
// 从 instring 字符串取得指向字符串 UTF 编码的指针
//注意C语言必须(*env)-> C++ env->
const jbyte *str =
(const jbyte *)(*env)->GetStringUTFChars(env,content, JNI_FALSE);
// this method is Java's method. Using (JNIENv type variable) env can use Java's method.
printf("%s\n",str);
// 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。
(*env)->ReleaseStringUTFChars(env, content, (const char *)str );
return;
}
该C程序中函数的功能是print传递过来的字符串。
创建一个Makefile文件,内容如下:
注意好像复制粘贴时tab可能会变成空格。需要将空格改成一个tab。
CROSS_COMPILE:=arm-linux-gnueabihf
LD:=$(CROSS_COMPILE)-ld
CPP:=$(CROSS_COMPILE)-gcc
CPPFLAGS:= -c -fPIC

本文详细介绍了在Linux下使用JNI调用本地C程序的步骤,包括Hello World程序、数据类型、数组参数的处理,以及解决执行jar包时的报错问题。在JNI接口设置中,重点讨论了动态链接库的加载和路径配置,同时提供了编译和运行的示例。文章还总结了JNI使用步骤,并给出了常见错误的分析和解决办法。
最低0.47元/天 解锁文章
394

被折叠的 条评论
为什么被折叠?



