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步骤:image
3.2步骤 :image
3.3步骤:image
为项目增加C++支持后,打开头文件(com_examples_jni_HelloWorld.h)会有警告,因为项目没有设置C++常用头文件的路径。我们要通过设置,把C++基本头文件和java的jni需要的头文件加上。在项目属性中设置:
3.4步骤:image
内容为:
/usr/include/c++/4.2.1 
/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers
3.5步骤:

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

image

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

编译成功:

image

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

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

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

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

image

下面是调用的代码:

package com.sample.jni;

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

运行结果:

image





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值