Mac OS X 下编译jni动态库(java调用C++)


1、创建一个HelloWorld.java文件,mac下通过“文本编辑”新建一个文件再保存。

class HelloWorld {
    
    //本地化函数声明,只声明不定义,main函数里直接调用
    public native void displayHelloWorld();
    
    static {
        //加载C模块,window下是hello.dll文件,mac下是libhello.jnilib文件
        //由下面的操作生成
        System.loadLibrary("hello");
    }
    
    public static void main(String[] args)
    {
        //调用上面声明的本地化方法
        new HelloWorld().displayHelloWorld();
    }
}

2、打开终端,cd到HelloWorld.java文件所在目录,执行

javac HelloWorld.java

命令,生成HelloWorld.class 文件。

3、执行

javah HelloWorld

命令,生成HelloWorld.h文件,该文件不作修改。

打开HelloWorld.h可以看到如下内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4、复制HelloWorld.h,重命名为HelloWorldImpl.c,或者直接创建一个文件,命名为HelloWorldImpl.c(保存成cpp也可以,下面的编译名字也由.c改成.cpp)

修改内容如下:

#include "jni.h"
#include "HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    printf("Hello World print!\n");
    return;
}

注意函数定义与头文件里的保持一致。

5、执行命令 

gcc -I/System/Library/Frameworks/JavaVM.framework/Headers -c HelloWorldImpl.c

编译完成后,会生成HelloWorldImpl.o文件


注意:/System/Library/Frameworks/JavaVM.framework/Headers 这个是你的jdk头文件的目录,主要是编译的时候要查找jni.h头文件。

6、将HelloWorldImpl.o打包成动态库

gcc -dynamiclib -o libhello.jnilibHelloWorldImpl.o

可以看出在mac下面,不是生成so文件,而是.jnilib文件。

7、运行

java HelloWorld


看到输出了c文件里定义的Hello World print!


--------------------------------------------------以上是java调用c--------------------------------------------------


如果是C调用java的方法,则需要用到JniHelper比较方便。待补充


注:终端编译java的时候如果出错,有汉字错误提示,但终端里显示的都是乱码,无法看清错误信息,解决办法:


1、下载Iterm

听说Iterm是一个更强大的终端。安装好后打开Iterm进行上述操作之前,需进行如下设置:


点击Preferences,然后进行如下图操作:



在ITerm里进行前面步骤,即可。




本文得益于:

http://ikinglai.blog.51cto.com/6220785/1212481

等。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值