AndroidStudioでJavaからCをCからJavaを
AndroidStudioでNDKを使っているとJavaからCを呼ぶのは簡単ですが、時々CからJavaを呼び出したくなるので覚書
(AndroidStudio 3.4.1を使用しています)
■Setp1:プロジェクト作成
AndroidStudioの「File」「New」「New Projekut」でプロジェクトを作成します。
今回はJavaからCを呼びたいので「Native C++」を選択し「Next」で次の画面に
Nameは適当に今回は「test01」
Save locationで今回作成するプロジェクトディレクトリを指定
Languageは「Java」で作成をします、設定ができたら「Next」で次の画面に
ここはただ単に「Finish」を選択します。
(この画面ではC++11とか、C++14を使う設定ができますが、後からでも設定できるので無視)
こんな画面がでたら、とりあえず、プロジェクト作成できました。
■Setp2:JavaからC
プロジェクト作成した時点で、JavaからCを呼び出すソースになっています。
実行すれば「MainActivity」のなかから「stringFromJNI()」をよんでいるので、native-lib.cppの「Java_l_toox_test01_MainActivity_stringFromJNI」が呼ばれています。
(細かい話は、別途勉強しましょう)
■Step3:CからJava
[MainActivity.Java]にCから呼ばれる関数「testFunc」を追加します。
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 となっている事を注意してください。)
Author And Source
この問題について(AndroidStudioでJavaからCをCからJavaを), 我々は、より多くの情報をここで見つけました https://qiita.com/sanoh/items/ef0b99fc1dd2f1484d7a著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .