环境:linux虚拟机
步骤:
·编写带有native声明的方法的java类
·使用javac命令编译所编写的java类
·然后使用javah + java类名生成扩展名为h的头文件
·cp上面的头文件,并修改,实现本地方法(这里用c/c++来编写)
·将C/C++编写的文件生成动态连接库
·ok
//所有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);
}
}
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
#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);
}
gcc -shared HelloWorld.o -o libhello.so
步骤:
·编写带有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
#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);
}
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