要在Android NDK中调用Java函数,可以按照以下步骤进行:
package com.example.myapp;
public class MyJavaClass {
public static int add(int a, int b) {
return a + b;
}
}
#include
extern "C" JNIEXPORT jint JNICALL
Java_com_example_myapp_MyNativeClass_add(JNIEnv* env, jobject /* this */, jint a, jint b) {
// 获取MyJavaClass的类引用
jclass clazz = env->FindClass("com/example/myapp/MyJavaClass");
// 获取add函数的方法ID
jmethodID methodId = env->GetStaticMethodID(clazz, "add", "(II)I");
// 调用Java函数
jint result = env->CallStaticIntMethod(clazz, methodId, a, b);
// 释放类引用
env->DeleteLocalRef(clazz);
return result;
}
在上面的代码中,Java_com_example_myapp_MyNativeClass_add
是一个JNI函数,它对应于Java代码中的MyNativeClass
类的add
方法。在这个JNI函数中,我们使用JNIEnv
指针调用了MyJavaClass
的add
函数,并返回结果。
jniLibs
目录添加到ndk配置中,并在其中放置你的.so文件。android {
...
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
...
}
jniLibs
目录下创建一个与目标ABI对应的子目录,并将你的.so文件放在该目录中。例如,对于armeabi-v7a ABI,你可以在jniLibs
目录下创建一个名为armeabi-v7a
的子目录,并将.so文件放在其中。
package com.example.myapp;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int result = MyNativeClass.add(2, 3);
Log.d("MainActivity", "Result: " + result);
}
}
在上面的代码中,我们通过调用MyNativeClass.add
函数来调用JNI函数,并打印结果。
这样,你就可以使用Android NDK调用Java函数了。记得在调用Java函数之前加载.so库,并且根据你的ABI配置正确放置.so文件。