在Android Studio中,使用Java从C语言转换到Java,再从Java转换到C语言

在使用AndroidStudio和NDK时,从Java调用C函数很简单,但有时候也会需要从C调用Java函数,这里做个记录。(使用AndroidStudio 3.4.1)

■步骤1:创建项目

2019-05-29 (6).png

步骤2:从Java转换到C。

在创建项目时就已经成为了一个从Java调用C的源代码。
如果执行,它会从”MainActivity”中调用”stringFromJNI()”,从而调用了”native-lib.cpp”中的”Java_l_toox_test01_MainActivity_stringFromJNI”。
(细节问题可以另行学习)

第三步:从C转换到Java

在MainActivity.java中添加一个名为“testFunc”的由C调用的函数。

package l.toox.test01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    public void testFunc(){
    }
}

下一步是读取C中的Java部分。我们将修改[Native-lib.cpp]如下。

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
tugini 
        JNIEnv *env,
        jobject in_thiz) {

    jobject my_class = env->NewGlobalRef(in_thiz);
    jclass clazz = env->GetObjectClass(my_class);
    jmethodID mobj = env->GetMethodID( clazz, "testFunc", "()V" );
    env->CallVoidMethod( my_class, mobj );
    env->DeleteLocalRef( clazz );

    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

请注意参数为jobject in_thiz的情况。

2019-05-29 (10).png
bannerAds