- 最近在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