Java 通过 JNI 调用 C 函数

本文详细介绍了如何使用Java通过JNI调用C函数的步骤,包括编写Java代码、编译Java、生成C头文件、编写C/C++代码、在Ubuntu下生成C共享库以及运行Java程序。在运行时,需确保Java库路径包含生成的共享库。
摘要由CSDN通过智能技术生成

第一步:编写 java 代码

class HelloJNI{
		//本地方法声明
        native void printHello();
        native void printString(String str);
		//加载库
        static{System.loadLibrary("hellojni");}

        public static void main(String args[]){
                HelloJNI myJNI = new HelloJNI();
				//调用本地方法
                myJNI.printHello();
                myJNI.printString("Hello world from printString fun");
        }
}

第二步:编译 java 代码

javac HelloJNI.java

第三步:生成 C 头文件

javah HelloJNI

生成 HelloJNI.h 头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    printHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printHello
  (JNIEnv *, jobject);

/*
 * Class:     HelloJNI
 * Method:    printString
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printString
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

第四步:编写 C/C++ 代码

#include "HelloJNI.h"
#include "stdio.h"

JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv * env, jobject obj){
        printf("Hello world!\n");
        return;
}

JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv * env, jobject obj, jstring string){
		//将 java String 转换成 C 字符串
        const char *str = (*env)->GetStringUTFChars(env,string,0);
        printf("%s!\n",str);
        return;
}

第五步:生成 C 共享库(Ubuntu下)

gcc -shared -fPIC -I /usr/lib/jvm/java-7-openjdk-amd64/include hellojni.c -o libhellojni.so

注:-I 参数指定 jni.h 的路径

第六步:运行 java 程序

java -Djava.library.path=. HelloJNI

注:需要将当前路径添加到 java.library.path 使其找到生成的共享库

参考资料:
1.《Android框架揭秘》
2. https://blog.csdn.net/fengqiaoyebo2008/article/details/6210499

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值