JNI开发:静态注册和动态注册
作者:互联网
1. 静态注册
jni开发中默认注册方式为静态注册,具体如下:
// MainActivity.java
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.sample_text); tv.setText(stringFromJNI()); } public native String stringFromJNI(); }
// native-lib.cpp extern "C" JNIEXPORT jstring JNICALL Java_com_example_myndkproject_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++ 静态注册"; return env->NewStringUTF(hello.c_str()); }
在java中通过native stringFromJNI()调用Java_com_example_myndkproject_MainActivity_stringFromJNI,达到使用C++代码开发核心内容的目的。
2. 动态注册
// MainActivity.java
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
Log.i("MainActivity",add_java(1,2)+"");
}
public native String stringFromJNI();
public native int add_java(int a,int b);
}
// native-lib.cpp jstring stringFromJNI(JNIEnv *env, jobject thiz){ std::string hello = "Hello from C++ 动态注册"; return env->NewStringUTF(hello.c_str()); } jint add_jni(JNIEnv *env,jobject thiz,jint a, jint b ) { return a+b; } static const JNINativeMethod gMethods[] = { {"stringFromJNI", "()Ljava/lang/String;", (jstring*)stringFromJNI}, {"add_java","(II)I",(jint*)add_jni}, }; JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){ __android_log_print(ANDROID_LOG_INFO, "native", "Jni_OnLoad"); JNIEnv* env = NULL; if(vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) //从JavaVM获取JNIEnv,一般使用1.4的版本 return -1; jclass clazz = env->FindClass("com/example/myndkproject/MainActivity"); if (!clazz){ __android_log_print(ANDROID_LOG_INFO, "native", "cannot get class: com/example/myndkproject/MainActivity"); return -1; } if(env->RegisterNatives(clazz, gMethods, sizeof(gMethods)/sizeof(gMethods[0]))) { __android_log_print(ANDROID_LOG_INFO, "native", "register native method failed!\n"); return -1; } return JNI_VERSION_1_4; }
标签:return,env,静态,MainActivity,注册,stringFromJNI,JNI,JNIEnv,native 来源: https://www.cnblogs.com/lewis-lau/p/14178108.html