Linux下JNI使用

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 最近在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语言声明。

  1. 创建一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值