Eclipse怎么快速开发jni程序?

  

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,您需要:

  1. 编写一个Native方法(一种在Java中声明,但在本地实现的方法)来调用C / C ++代码。
  2. 使用javah命令生成这个本地方法的头文件。
  3. 使用C / C ++编写本地函数的实现。
  4. 将C / C ++代码编译为共享库格式,这可以在运行时使用System.loadLibrary()方法加载(或者在Windows上使用System.load()方法)。
  5. 编写测试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++库

  1. 在Eclipse中打开合适的Java项目。
  2. 在Project Explorer视图中,右键单击Java项目并选择新建文件夹,然后命名为"jni”。
  3. 在此文件夹下,新建一个Makefile文件。
  4. 将C / C ++代码复制到“jni”文件夹。
  5. 使用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 库的步骤。

相关文章