jni的环境搭建

最近研究了一下android jni的用法,JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)
进行交互。并非从Android发布才引入JNI的概念的。要实现JNI编程,首先要准备工具,我的是平时用的android开发环境,sdk eclipse,另外又下载了一个ndk.
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。
        而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。
        当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。
        我是从网上下载的android-ndk32-r10b-windows-x86版本,放到一个文件夹下解压,注意路径中尽量不要用中文。
3、JNI  调用流程
 1、首先先在eclipse上新建一个工程,命名为 JniDemo 我是保存在了E:\demo\JniDemo
 2、重新创建一个类,我命名为JniUtils,在这个类里声明一个方法 
  public class JniUtils {
   public static native  String getStringFromC();
  }
 3、在MainActivity中引用此方法
 public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Log.i("msg", "ddd:" + JniTest.getStringFromC());
 }
 
}
 4、在工程下添加 jni 的文件,新建一个Android.mk文件,我需要交互的是c++语言,我的Android.mk如下:
 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := JniDemo
LOCAL_SRC_FILES := JniDemo.cpp
include $(BUILD_SHARED_LIBRARY)
 若为C语言交互,Android.mk如下:
 LOCAL_PATH := $(call my-dir)
   include $(CLEAR_VARS)
   LOCAL_MODULE    := JniDemo
   LOCAL_SRC_FILES := JniDemo.c 
   include $(BUILD_SHARED_LIBRARY)
   
   其中module为即将生产的.so包名,在java代码里需要引用此包名,files是对应要新建的C/C++文件名
   添加到Android.mk文件,再继续在jni文件夹里添加.c/.cpp文件,文件名为files对应的名字
   
   5、添加ndk路径,在eclipse的Windows->Preferences下Android->NDK下有NDK Location选项,选则解压的ndk的路径
   在eclipse的Project->Properties下选择Builders下选择new,在弹窗选择Program进到设置页面
   Location选择ndk的路径\ndk-build.cmd
   Working Directory选择工程所在的目录
   然后选择第二项Refresh 进行相应配置
   选择第4项Build Options进行相应配置
   6、打开工程所在文件夹,进入bin->classes 进入E:\demo\JniDemo\bin\classes\com\example\jnidemo查看是否有native方法
   所在文件的.class文件,
   cmd运行环境,进到classes所在的目录,执行javah com.example.jnidemo.JniUtils在classes下回生成.h文件,将此文件
   复制到eclipse的jni文件夹下
   7、编写c文件,如下
 JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniUtils_getStringFromC(JNIEnv * env, jclass obj){
    //java to c
    return env->NewStringUTF("this is c++ code");
}
 8、最后在MainActivity中添加引用包
 static {
  System.loadLibrary("JNIDemo");
 }
 9、运行,打印出this is c++ code.

猜你喜欢

转载自blog.csdn.net/hszfor/article/details/51705265