java 调 c++

首先编写java接口 

public class NativeCall {

    public native void onSdkCallResult(int code);    //这个方法要在java外部实现 所以使用native关键字修饰

}

终端命令

2.  javac HelloWorld.java 生成HelloWorld.class文件

3.生成.h   可以自己手写 也可以终端命令生成 ( javah HelloWorld )

#include "../../../../../cocos2dx/platform/CCPlatformConfig.h"

#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)

#include <jni.h>

#include "../../../../../cocos2dx/platform/android/jni/JniHelper.h"

#include <android/log.h>

#ifndef _Included_com_football_apk_anzhuo91_NativeCall

#define _Included_com_football_apk_anzhuo91_NativeCall

#ifdef __cplusplus

extern "C" {

#endif

JNIEXPORT void JNICALL Java_com_football_apk_anzhuo91_NativeCall_onSdkCallResult(JNIEnv *, jobject, jint); 

//注意JNIEXPORT  JNICALL都是jni里的关键字 表示这个函数是java函数的外部实现 函数名是java的函数路径 -- 明白这个就完全可以手写.h .cpp 了

//前两个参数JNIEnv *和jobject 是必需的——前者是一个JNIEnv 结构体的指针是JNI的核心数据,这个结构体中定义了很多JNI的接口函数指针,使开发者可以使用JNI所定义的接口功能;

//后者指代的是调用这个JNI函数的Java对象,有点类似于C++中的this 指针

#ifdef __cplusplus

}

#endif

#endif

#endif

4、生成cpp 可以自己手写 也可以终端命令生成

#include "../../../../../cocos2dx/platform/CCPlatformConfig.h"

#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)

#include "com_football_apk_anzhuo91_NativeCall.h"

#include "cocos2d.h"

#include "SDKCallFun.h"

extern "C" {

JNIEXPORT void JNICALL Java_com_football_apk_anzhuo91_NativeCall_onSdkCallResult

  (JNIEnv *evn, jobject obj, jint code)

{

//code在java中传入 c++获取 针对不同code做不同操作

}

#endif


把.h .cpp 文件加入工程 编译成.a 文件  (写进Android.mk)


以下参考:

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ikinglai.blog.51cto.com/6220785/1212481

1. 编写java文件


public class HelloWorld

{

   public native String printHelloWorld();


   static{

       System.loadLibrary("helloworld");

   }

//要使用JNI函数,还需要先加载Native代码编译出来的动态库文件(在Windows上是.dll,在Linux上则为.so)。以上是代码


  public static void main(String[] args)

  {

       HelloWorld h = new HelloWorld();

       String str = h.printHelloWorld();

       System.out.println(str);

  }


}


2.  javac HelloWorld.java 生成HelloWorld.class文件


3. javah HelloWorld 生成HelloWorld.h 头文件


4. 编写HelloWorld.c文件


#include "HelloWorld.h"


JNIEXPORT jstring JNICALL Java_HelloWorld_printHelloWorld

 (JNIEnv *env, jobject obj)

{

   return (*env)->NewStringUTF(env, "Hello World from JNI !");

}

   

5 编译HelloWorld.c    //使用gcc将c或cpp编译成.o  

<span style="font-family: arial, 'courier new', courier, 宋体, monospace;"><span style="line-height: 24px;">//<span style="font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">.o文件就是对象文件,里面包含的内容就是01这样的机器可执行的指令,当程序要执行时还需要进行链接(link).链接就是把多个.o文件链成一个可执行文件。</span></span></span><span style="font-size: 20px; font-family: 'Microsoft YaHei'; line-height: 30px;"> </span>

//.a文件就是多个.o文件的组合。

//GCC编译器(多种硬体平台上编译出可执行程序的超级编译器)

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

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


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


6  将HelloWorld.o打包成动态库   //使用gcc将.o生成 动态库

//LINUX系统中.a文件是静态链接库文件。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

.so文件是共享库文件(动态链接)。动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的.so之间建立链接关系。

gcc -dynamiclib -o libhelloworld.jnilib HelloWorld.o

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


7 运行

java HelloWorld


hejinlai_iMac:jni hejinlai$ java HelloWorld

Hello World from JNI !

hejinlai_iMac:jni hejinlai$


运行成功!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值