<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NDK</title>
	<atom:link href="https://bps-e.com/dev/tag/ndk/feed/" rel="self" type="application/rss+xml" />
	<link>https://bps-e.com/dev</link>
	<description>android アプリ開発 kotlin + jetpack compose + material 3</description>
	<lastBuildDate>Sun, 24 Sep 2023 12:53:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://bps-e.com/dev/wp-content/uploads/2022/10/cropped-logo3-32x32.png</url>
	<title>NDK</title>
	<link>https://bps-e.com/dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[Android] 007. Native Library(NDK)</title>
		<link>https://bps-e.com/dev/android-003-007/</link>
		
		<dc:creator><![CDATA[bps-e]]></dc:creator>
		<pubDate>Mon, 31 Jul 2023 12:51:17 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Giraffe]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[Android Native Library]]></category>
		<category><![CDATA[NDK]]></category>
		<guid isPermaLink="false">https://bps-e.com/dev/?p=665</guid>

					<description><![CDATA[Native Libraryを新規作成して自動生成されたメソッドの呼び出しまでを試してみます Android Native Library 作成 メニューのFile &#8211; New &#8211; New Mod [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Native Libraryを新規作成して自動生成されたメソッドの呼び出しまでを試してみます</p>



<h2 class="wp-block-heading"><span id="toc1">Android Native Library 作成</span></h2>



<p>メニューのFile &#8211; New &#8211; New ModuleからAndroid Native Libraryを追加します<br>今回は既存のライブラリを想定して言語はJavaにしています</p>



<figure class="wp-block-image size-full is-resized"><img fetchpriority="high" decoding="async" src="https://bps-e.com/dev/wp-content/uploads/2023/07/image-30.png" alt="" class="wp-image-667" style="aspect-ratio:638/410" width="638" height="410" srcset="https://bps-e.com/dev/wp-content/uploads/2023/07/image-30.png 850w, https://bps-e.com/dev/wp-content/uploads/2023/07/image-30-300x193.png 300w, https://bps-e.com/dev/wp-content/uploads/2023/07/image-30-768x494.png 768w" sizes="(max-width: 638px) 100vw, 638px" /></figure>



<p>moduleにnativelibが追加され以下のコードが自動生成されます<br>nativelib/cpp/nativelib.cpp<br>            /java/(package)/NativeLib.java</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-file="nativelib.cpp" data-lang="C++"><code>#include &lt;jni.h&gt;
#include &lt;string&gt;

extern &quot;C&quot; JNIEXPORT jstring JNICALL
Java_com_example_nativelib_NativeLib_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = &quot;Hello from C++&quot;;
    return env-&gt;NewStringUTF(hello.c_str());
}</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-java" data-file="NativeLib.java" data-lang="Java"><code>package com.example.nativelib;

public class NativeLib {
    // Used to load the &#39;nativelib&#39; library on application startup.
    static {
        System.loadLibrary(&quot;nativelib&quot;);
    }

    /**
     * A native method that is implemented by the &#39;nativelib&#39; native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}</code></pre></div>



<h2 class="wp-block-heading"><span id="toc2">呼び出し</span></h2>



<p>Project Structureなどで作成したnativelibをimplementationします<br>DependenciesのModulesのappを選択してDeclared Dependenciesの+ボタンを押して3 Module Dependencyを選択<br>nativelibにチェックを入れてokボタンを押す</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://bps-e.com/dev/wp-content/uploads/2023/07/image-31.png" alt="" class="wp-image-669" style="aspect-ratio:714/376" width="714" height="376" srcset="https://bps-e.com/dev/wp-content/uploads/2023/07/image-31.png 952w, https://bps-e.com/dev/wp-content/uploads/2023/07/image-31-300x158.png 300w, https://bps-e.com/dev/wp-content/uploads/2023/07/image-31-768x404.png 768w" sizes="(max-width: 714px) 100vw, 714px" /></figure>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://bps-e.com/dev/wp-content/uploads/2023/07/image-32.png" alt="" class="wp-image-670" style="aspect-ratio:456/607" width="456" height="607" srcset="https://bps-e.com/dev/wp-content/uploads/2023/07/image-32.png 608w, https://bps-e.com/dev/wp-content/uploads/2023/07/image-32-225x300.png 225w" sizes="(max-width: 456px) 100vw, 456px" /></figure>



<p>自動生成されたコードをkotlin側から呼び出ししてみます<br>Halloボタンを押すとLogcatに「Hello from C++」が表示されます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-kt" data-file="MainActivity.kt" data-lang="Kotlin"><code>Column {
    val nativeLib = NativeLib()
    Button(onClick = { Log.d(&quot;TestApp&quot;, nativeLib.stringFromJNI()) }) {
        Text(&quot;Hello&quot;)
    }
}</code></pre></div>



<h2 class="wp-block-heading"><span id="toc3">kotlin</span></h2>



<p>言語のkotlinにした場合は以下ようなのコードが自動生成されます<br>呼び出し方はJava版と同じです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-kt" data-file="NativeLib.kt" data-lang="Kotlin"><code>package com.example.nativelib

class NativeLib {
    /**
     * A native method that is implemented by the &#39;nativelib2&#39; native library,
     * which is packaged with this application.
     */
    external fun stringFromJNI(): String

    companion object {
        // Used to load the &#39;nativelib&#39; library on application startup.
        init {
            System.loadLibrary(&quot;nativelib&quot;)
        }
    }
}</code></pre></div>



<h2 class="wp-block-heading"><span id="toc4">Jetpack Composeプロジェクトにc/c++サポート追加する方法</span></h2>



<p>普通にAndroid StudioをインストールしていればNDKがインストールされているはずですが念のため確認</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://bps-e.com/dev/wp-content/uploads/2023/09/image-22.png" alt="" class="wp-image-1063" style="width:400px" width="400" srcset="https://bps-e.com/dev/wp-content/uploads/2023/09/image-22.png 984w, https://bps-e.com/dev/wp-content/uploads/2023/09/image-22-300x222.png 300w, https://bps-e.com/dev/wp-content/uploads/2023/09/image-22-768x569.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></figure>



<div style="height:var(--wp--preset--spacing--50)" aria-hidden="true" class="wp-block-spacer"></div>



<p>(project)/(module)/src/main/cppフォルダを作成してAndroid StudioのProjectのTree表示をProjectにしてcppフォルダを選択して右クリックメニューでNew &#8211; CMakeList.txtでCMakeList.txtを作ります</p>



<p>とりあえずCMakeList.txtに何も指定しなくても良いが以下を指定<br>※ cmake_minimum_requiredは適切なバージョンを指定<br>    &lt;project名>には&#8221;testndk&#8221;のように任意のプロジェクト名を指定してください</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="CMakeList.txt"><code>cmake_minimum_required(VERSION 3.4.1)

project(&lt;project名&gt;)</code></pre></div>



<p>build.gradle.kts(Module)に以下を追加<br>これでcppフォルダがSorce Root認識されてProjectのTree表示をAndroidにしてもcppフォルダが見えるようになります<br>CMakeのversionを指定する場合はSDK ToolのShow Package Detalisを有効にしてインストールされているCMakeのバージョンを確認してください</p>



<p>あとは必要に応じた実装とCMakeList.txtの編集をしてください</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-kt" data-file="build.gradle.kts(Module)" data-lang="Kotlin"><code>android {
    externalNativeBuild {
        cmake {
            path = file(&quot;src/main/cpp/CMakeLists.txt&quot;)
        }
    }
}</code></pre></div>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://bps-e.com/dev/wp-content/uploads/2023/09/image-23.png" alt="" class="wp-image-1064" style="width:400px" width="400" srcset="https://bps-e.com/dev/wp-content/uploads/2023/09/image-23.png 984w, https://bps-e.com/dev/wp-content/uploads/2023/09/image-23-300x222.png 300w, https://bps-e.com/dev/wp-content/uploads/2023/09/image-23-768x569.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="has-text-align-right">Android Studio Giraffe 2022.3.1 built on June 29, 2023</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
