Mac下编写Ndk(二):编写jni文件

一、编写java文件,如HelloWorld.java

package com.sample.jni;
public class HelloWorld { 
    public native void sayHello(); 
}

二、 生成头文件,进入bin目录(就是存放java class的根目录),然后执行javah命令,生成头文件:

 
如至项目my_jni项目上执行以上几个步骤即可生成.h文件

.h内容类似下面的
/* DO NOT EDIT THIS FILE – it is machine generated */ 
#include <jni.h> 
/* Header for class com_sample_jni_HelloWorld */
#ifndef _Included_com_sample_jni_HelloWorld 
#define _Included_com_sample_jni_HelloWorld 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:     com_sample_jni_HelloWorld 
* Method:    sayHello 
* Signature: ()V 
*/ 
JNIEXPORT void JNICALL Java_com_sample_jni_HelloWorld_sayHello 
  (JNIEnv *, jobject);
#ifdef __cplusplus 
} 
#endif 
#endif
三、在.cpp文件中编写
JNIEXPORT void JNICALL Java_com_sample_jni_HelloWorld_sayHello 
  (JNIEnv *, jobject);方法中的实现
编写C++代码需要一点准备工作,让java项目支持C++,这需要你的Eclipse安装CDT。
3.1步骤:
3.2步骤 :
3.3步骤:
为项目增加C++支持后,打开头文件(com_examples_jni_HelloWorld.h)会有警告,因为项目没有设置C++常用头文件的路径。我们要通过设置,把C++基本头文件和java的jni需要的头文件加上。在项目属性中设置:
3.4步骤:
内容为:
/usr/include/c++/4.2.1 
/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers
3.5步骤:

我们要为项目设置头文件的位置,需要设置到NDK的指定目录下:

内容:/Users/lanhongmei/application_files/installing_files/android-ndk-r8d/platforms/android-14/arch-arm/usr/include
需要设置构建工具的路径,和之前jni项目不同,后者直接使用gcc来做。

内容为:/Users/lanhongmei/application_files/installing_files/android-ndk-r8d/build

这里,第一个是GCC的C++需要的头文件目录,第二个是jni需要的。
可以编写C++实现代码了:

#include <jni.h> 
#include <iostream> 
#include "com_sample_jni_HelloWorld.h"

using namespace std;

JNIEXPORT void JNICALL Java_com_sample_jni_HelloWorld_sayHello 
  (JNIEnv *env, jobject thiz){ 
    cout<<"你好!"<<endl; 
}


因为是动态库,因此这个代码是不能执行的,需要调用执行。编译直接用command+b即可。

编译成功:

生成的libJniSample.dylib在Debug目录下。

为了使用这个库,我们需要把它放到java代码运行时可加载的路径下,最简单的办法是放到项目的根目录下。

还有个问题,mac下加载jni库,java需要该库的扩展名是:jnilib

因此,我将libJniSample.dylib改名为libHelloWorld.jnilib存放在项目根目录下:

下面是调用的代码:

package com.sample.jni;

public class HelloWorld { 
    public native void sayHello(); 
    static{ 
        System.loadLibrary("HelloWorld"); 
    } 
    public static void main(String[] args) { 
        new HelloWorld().sayHello(); 
    } 
}

运行结果:





你可能感兴趣的:(Mac下编写Ndk(二):编写jni文件)