jni_1th

来源:互联网 发布:知乎怎么更新答案 编辑:程序博客网 时间:2024/06/05 04:06
环境:linux虚拟机
步骤:
  ·编写带有native声明的方法的java类
  ·使用javac命令编译所编写的java类
  ·然后使用javah + java类名生成扩展名为h的头文件
  ·cp上面的头文件,并修改,实现本地方法(这里用c/c++来编写)
  ·将C/C++编写的文件生成动态连接库
  ·ok

HelloWorld.java文件:

public class HelloWorld {
  //所有native关键词修饰的都是对本地的声明
    public native String displayHelloWorld(int a,int b,String c);
    static{
        System.loadLibrary("hello");//载入本地库
    }
    public static void   main(String[] args) {
        String aa=new HelloWorld().displayHelloWorld(5,10,"hello");
        System.out.println(aa);
    }
}              

Javac HelloWorld.java=>编译可得:HelloWorld.class




Javah HelloWorld=>生成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: (IILjava/lang/String;)V
 */
JNIEXPORT jstring JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *, jobject,jint,jint,jstring);
#ifdef __cplusplus
}
#endif

#endif



cp HelloWorld.h HelloWordl.c并修改得:

#include <stdio.h>
#include <string.h>
#include "HelloWorld.h"

JNIEXPORT jstring  JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj,jint a,jint b,jstring c){

    char buf[100]="string";
//转换为本地的字符串
    char *str = (*env)->GetStringUTFChars(env, c, NULL);    
    printf(str);
    printf("%d\n",a+b);
//将本地的字符串,转换为上层上层apk可用。
    return (*env)->NewStringUTF(env, buf);
}



生成native动态库:                                 

gcc -c  -fPIC -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/include -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/include/linux HelloWorld.c -o HelloWorld.o

(上面两个路径分别为:jni.h与jvm.h的路径)


gcc -shared HelloWorld.o -o libhello.so


0 0