Android项目右键Android Tools-->Add Native Support然后输入JNI的名称如:hello
项目目录下边就会创建jni的目录
创建包:package com.example.jni
创建两个类:CCallJava和JavaCallC
package com.example.jni;
public class JavaCallC {
/**
* sum a and b
*
* @param a
* @param b
* @return sum
*/
public static native int sum(int a, int b);
/**
* a reduce b
*
* @param a
* @param b
* @return value
*/
public static native int reduce(int a, int b);
}
和
package com.example.jni;
import android.util.Log;
public class CCallJava {
/**
* @param value
* @return sum
*/
public static void sum(int value, String s) {
Log.d("CCallJava", "sum:" + value + " s:" + s);
}
/**
* @param value
*/
public static void reduce(int value, String s) {
Log.d("CCallJava", "reduce:" + value + " s:" + s);
}
}
在hello.cpp中添加代码
#include <jni.h>
#include <string.h>
#include<stdio.h>
extern "C" {
jclass gCCallJavaClass;
JNIEXPORT jstring JNICALL Java_com_example_testjni_MainActivity_myhello(
JNIEnv * env, jobject obj);
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_sum(JNIEnv * env,
jobject obj, jint a, jint b);
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_reduce(JNIEnv * env,
jobject obj, jint a, jint b);
};
//调用并C++层直接返回String的字符串
JNIEXPORT jstring JNICALL Java_com_example_testjni_MainActivity_myhello(
JNIEnv * env, jobject obj) {
return env->NewStringUTF("Hello From CPP");
}
//调用底层计算,并通过另外一个函数把结果返回到java层
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_sum(JNIEnv * env,
jobject obj, jint a, jint b) {
printf("s%\n","Java_com_example_jni_JavaCallC_sum start");
//获取结果返回的函数所在类
jclass localRefCls = env->FindClass("com/example/jni/CCallJava");
if(localRefCls==NULL){
printf("s%\n","localRefCls==NULL");
return;
}
//获取类对象
gCCallJavaClass = (jclass) env->NewGlobalRef(localRefCls);
env->DeleteLocalRef(localRefCls);
if(gCCallJavaClass==NULL){
printf("s%\n","gCCallJavaClass==NULL");
return;
}
//计算结果
jint sum = a + b;
//获取函数所在类的函数id
jmethodID methodID =env->GetStaticMethodID(gCCallJavaClass, "sum","(ILjava/lang/String;)V");
printf("s%\n","methodID");
if (methodID == NULL) {
printf("s%\n","methodID == NULL");
} else {
//调用函数返回结果
env->CallStaticVoidMethod(gCCallJavaClass, methodID, sum,env->NewStringUTF("Java_com_example_jni_JavaCallC_sum"));
}
}
//该方法和上边的方法一致
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_reduce(JNIEnv * env,
jobject obj, jint a, jint b) {
printf("s%\n","Java_com_example_jni_JavaCallC_sum start");
jclass localRefCls = env->FindClass("com/example/jni/CCallJava");
if(localRefCls==NULL){
printf("s%\n","localRefCls==NULL");
return;
}
gCCallJavaClass = (jclass) env->NewGlobalRef(localRefCls);
env->DeleteLocalRef(localRefCls);
if(gCCallJavaClass==NULL){
printf("s%\n","gCCallJavaClass==NULL");
return;
}
jint sum = a - b;
jmethodID methodID =env->GetStaticMethodID(gCCallJavaClass, "reduce","(ILjava/lang/String;)V");
printf("s%\n","methodID");
if (methodID == NULL) {
printf("s%\n","methodID == NULL");
} else {
env->CallStaticVoidMethod(gCCallJavaClass, methodID, sum,env->NewStringUTF("Java_com_example_jni_JavaCallC_reduce"));
}
}
调用:
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setText(myhello());
String s;
JavaCallC.sum(100, 100);
JavaCallC.reduce(100, 123);
}
public native String myhello();
static {
System.loadLibrary("hello");
}
结果:
sum:200 s:Java_com_example_jni_JavaCallC_sum
reduce:-23 s:Java_com_example_jni_JavaCallC_reduce