#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