eclipse的jni配置

本文详细介绍了在Eclipse中配置JNI,新建Android工程,书写Java端调用代码,添加native支持,设置NDK路径,创建并调用cpp本地库文件的步骤。通过这些步骤,可以实现Java调用C++的本地方法,如printJNI,最终完成一个简单的JNI调用示例。

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

Eclipse的JNI配置

一、 新建一个Android工程

二、 Java端调用代码书写

本地方法定义:

private native String printJNI();

加载本地库文件

static{
    System.loadLibrary("JNILibrary");
}

其中JNILibrary是调用的动态库名,printJNI是调用的本地方法,其返回值类型和参数跟普通的java方法一样。

三、 添加native支持

右键点击工程,选中AndroidTools -> Add Native Support,然后可以为本地库文件重命名,点击OK后,可以看到工程中多出了一个jni文件夹,其中包含一个cpp文件和一个Android.mk文件。此外,在libs文件夹中多出了armeabi文件夹,文件夹中多出了一个libJNITest.so库文件,库文件名由lib+刚刚的命名决定。

四、添加ndk文件路径支持

此时还不能使用native方法,需要添加一些ndk的支持。右键工程,选择Properties -> C/C++ General -> Paths and Symbols(注意第三步和这一步顺序不能颠倒,否则在Properties中将不会看到C/C++ General这个选项),在Path and Symbols中,选择includes选项卡,点击Add,添加下面四个路径:

/home/work/android/android-ndk-r9/platforms/android-18/arch-arm/usr/include/

/home/work/android/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.6/include/

/home/work/android/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include/

/home/work/android/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.6/include/

这四个路径为自己本地当中的ndk文件夹中的路径,选择自己的路径就好。选中这四个路径后,点击界面下方的Export Settings,导出这四个路径到文件,以后添加native支持的时候,可以直接用Import Settings直接导入,而不用每次都手动添加这四个路径。

这些工作完成后点击Apply -> OK,此时工程中会多出几个文件,其中Includes文件夹中包含的就是刚刚加入的路径。

五、创建cpp本地库文件并调用

用命令行cd切换到工程中的src文件目录下,输入命令:(我的工程代码目录是com/peng/jniexercise/MainActivity.java)

javah com.peng.jniexercise.MainActivity

若成功则会在src目录下生成一个.h头文件,这个头文件的名称为

com_peng_jniexercise_MainActivity.h

这个文件的名称是由java的包路径加包名加类名组成的,里面包含了jni调用的cpp模板,打开这个文件,里面的代码为:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_peng_jniexercise_MainActivity */
#ifndef _Included_com_peng_jniexercise_MainActivity
#define _Included_com_peng_jniexercise_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_peng_jniexercise_MainActivity
 * Method:    printJNI
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_peng_jniexercise_MainActivity_printJNI
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

可以看到,里面包含了这样一个方法声明:

JNIEXPORT jstring JNICALL Java_com_peng_jniexercise_MainActivity_printJNI(JNIEnv *, jobject, jstring);

这个方法声明虽然很长,但实际上它的结构组成是:

Java_包名_类名_声明的native方法名(参数列表)

将这个文件中的内容拷贝到jni/JNILibrary.cpp中,即将JNILibrary.cpp中的内容全部覆盖,将方法声明改成具体的方法,然后保存,即可在java端调用native方法 printJNI()了。具体的native方法的demo如下:

JNIEXPORT jstring JNICALL Java_com_peng_jniexercise_MainActivity_printJNI
  (JNIEnv * env, jobject obj, jstring str){
    return env -> NewStringUTF("hello JNI");
}

这时在java端调用printJNI()即可获得native方法返回的字符串”hello JNI”了。

至此,一个简单的JNI配置和调用就完成了。

总结:

  • 注意System.loadLibrary(“库名”)这个方法中的库名要和本地库名一致,如果不一致会导致调用失败。

  • 第三步和第四步的先后次序不能调乱,否则将不会出现C/C++ General选项。

  • 在添加ndk路径支持的时候,可以将配置的路径导出,这样下次导入的时候就不用一个一个路径导入了,只需要导入这个配置文件即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值