Eclipse怎么快速开发jni程序?
1. 什么是jni?
Java本地接口(Java Native Interface,JNI)是一个桥接库,可以让Java虚拟机(JVM)调用本地代码。JVM本身是由C / C ++编写的,因此JNI为Java程序员提供了调用C / C ++库中函数的能力,同时也为C / C ++程序员提供了将代码与Java应用程序集成的途径。
2. JNI怎么使用?
要在Java应用程序中使用JNI,您需要:
- 编写一个Native方法(一种在Java中声明,但在本地实现的方法)来调用C / C ++代码。
- 使用javah命令生成这个本地方法的头文件。
- 使用C / C ++编写本地函数的实现。
- 将C / C ++代码编译为共享库格式,这可以在运行时使用System.loadLibrary()方法加载(或者在Windows上使用System.load()方法)。
- 编写测试Java类以使用您的本地函数。
3. Eclipse怎么快速开发jni程序?
在Eclipse中,您可以使用C / C ++开发工具包(CDT)和Java开发工具包(JDT)来快速开发jni程序。下面是一些操作步骤,以便您在Eclipse中使用JNI:
步骤1:准备C / C ++代码
要调用本地函数,首先您需要编写C / C ++代码。在Eclipse中,您可以使用Eclipse CDT来编写C / C ++代码。
示例代码:
#include <jni.h>
#include <stdio.h>
JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_getStringFromNative(JNIEnv *env, jobject obj)
{
char* str = "Hello from JNI !";
return (*env)->NewStringUTF(env, str);
}
步骤2:生成头文件
为了使Java应用程序调用本地函数,您需要生成头文件。在Eclipse中,您可以使用javah命令来生成头文件。在Java文件所在目录下用cmd命令进入即可。
示例命令:
javah -jni com.example.jnitest.MainActivity
生成的头文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jnitest_MainActivity */
#ifndef _Included_com_example_jnitest_MainActivity
#define _Included_com_example_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_getStringFromNative
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
步骤3:编写Java代码
您还需要编写Java代码。在Eclipse中,Java代码可以与C / C ++代码一起运行。
示例代码:
package com.example.jnitest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
static {
System.loadLibrary("jniDemo");//注意Windows下的库文件是jniDemo.dll 而在Linux/Mac上是libjniDemo.so
}
public native String getStringFromNative();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView show = (TextView)findViewById(R.id.show);
show.setText(getStringFromNative());
}
}
这里是一个重点。在Java代码中声明了一个native
方法getStringFromNative()
,这个函数的实现在C / C ++代码中。
步骤4:编写Makefile进行编译
# Makefile for building the native code of JNI demo.
#
TOPDIR := $(shell pwd)
CC := $(CROSS_COMPILE)gcc
CFLAGS := -O2 -Wall -I$(JAVA_HOME)/include/ -I$(JAVA_HOME)/include/linux/
LDFLAGS:= -shared -Wl,-soname,libjniDemo.so -o libjniDemo.so
OBJS := jniDemo.o
all: jniDemo.so
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
jniDemo.so: $(OBJS)
$(CC) $(LDFLAGS) $(OBJS) -lc -o $@
clean:
rm -f *.o *.so
步骤5:完成配置并编译C++库
- 在Eclipse中打开合适的Java项目。
- 在Project Explorer视图中,右键单击Java项目并选择新建文件夹,然后命名为"jni”。
- 在此文件夹下,新建一个Makefile文件。
- 将C / C ++代码复制到“jni”文件夹。
- 使用
make
命令编译生成共享库,并将其放在与Java代码所在的包相同的目录中。
示例:
第1步:选择Java项目
在Eclipse打开Java项目
第2步:创建jni文件夹并新建Makefile文件
在Project Explorer
中,右键单击Java项目,选择New -> Folder, 命名为"jni”。
在jni文件夹下新建Makefile文件。
第3步:在jni目录下复制C/C++代码
将C / C ++代码复制到“jni”文件夹。
第4步:运行Makefile,并生成jni库
在运行过程中可能遇到jni.h不存在的问题,在Android SDK中下载对应的NDK,找到其include文件夹,将此文件夹添加到CFLAGS中。
在当前目录打开终端,输入命令
make
生成so文件
libjniDemo.so
如果出现类似错误
/usr/bin/ld: cannot find -lc
请执行以下命令
sudo apt-get install build-essential
sudo apt-get install libc6-dev
步骤6:安装生成的JNI库并运行
将生成的JNI库文件(libjniDemo.so)放在Java代码的根目录中。
在Java代码中调用本地函数。
在终端中输入以下命令运行程序。
adb shell am start -n com.example.jnitest/com.example.jnitest.MainActivity
4. 小结
这篇文章介绍了使用Eclipse快速开发JNI程序的方法。我们提供了如何编写和使用C / C ++代码、如何使用javah生成头文件、如何编写Java代码与C / C ++代码一起运行、如何通过Makefile将C / C ++代码编译为 JNI 库的步骤。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Eclipse怎么快速开发jni程序? - Python技术站