一、实现思路
1.创建一个可供java 代码调用的本地函数
2.将需要实现本地实现的java代码加上native声明
3.使用javac -h xxx1 xxx2 编译java类,xxx1是生成.h文件的目录(若无此目录,则自动新建),xxx2是需要编译的java源文件,同目录下生成xx.class,xx是类名
4.新建cpp文件,实现生成的.h中的native方法
5.编写Android.mk,使用mm命令,编译该jni模块为so库
6.在java类中加载此so库
二、源码如下sdk/device/rockchip/apps/jni_demo/
1.新建/src/com/android/JniDemo.java
/*TestJNI*/
package com.android.jnidemo;
class TestJNI
{
public static native String helloWorld();
static
{
System.loadLibrary("ananjni");//
}
public static void main(String args[]){
TestJNI hello = new TestJNI();
hello.helloWorld();
}
}
2.命令输入javac -h …/…/…/jni/include/ JniDemo.java,同目录下生成TestJNI.class,jni_demo目录下生成了jni/include/com_android_jnidemo_TestJNI.h文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_android_jnidemo_TestJNI */
#ifndef _Included_com_android_jnidemo_TestJNI
#define _Included_com_android_jnidemo_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_android_jnidemo_TestJNI
* Method: helloWorld
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_android_jnidemo_TestJNI_helloWorld
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3.在jni目录下新建cpp文件anan_jni_lib.cpp,实现native方法
#include <stdio.h>
#include <string>
#include "include/com_android_jnidemo_TestJNI.h"
using namespace std;
JNIEXPORT jstring JNICALL
Java_com_android_jnidemo_TestJNI_helloWorld(
JNIEnv *env, jclass jobj){
string hello = "Hello world 是jni调用的字符串";
return env->NewStringUTF(hello.c_str());
}
4.在jni目录下编写Android.mk,并编译so库
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
MY_CPP_LIST := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES := $(MY_CPP_LIST)
LOCAL_MODULE := libananjni
include $(BUILD_SHARED_LIBRARY) #此处注意应该是BUILD_SHARED_LIBRARY
在学习中进步,如有错误,请多多批评指正