質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JNI

JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

1749閲覧

AndroidOSの共有ライブラリはLinuxで利用できないのでしょうか?

daiki002

総合スコア68

JNI

JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2021/04/06 04:21

編集2021/04/06 05:05

前提・実現したいこと

Androidの共有ライブラリ(.soファイル)をLinux(ARM32)で利用したいです。
Androidの共有ライブラリ(.soファイル)をAndroid(ARM32)で実行は問題なく出来ました。
(Java経由の呼び出しでは無く、実行ファイルから共有ライブラリの関数を呼び出す形です。)

AndroidもLinuxの一種のはずです。
しかしなぜLinuxのRaspbian(Raspberry Pi 4)では共有ライブラリ(.soファイル)を利用するとSegmentation faultになるのでしょうか?

LinuxであればELF形式でアーキテクチャが一致していれば動作すると思っていたのですが、そもそもこの理解が間違っているのでしょうか?

発生している問題・エラーメッセージ

bash

1$ ./a.out 2Segmentation fault 3

libhelloworld.soのソースコード

  • jni/Android.mk

Makefile

1LOCAL_PATH := $(call my-dir) 2 3include $(CLEAR_VARS) 4 5LOCAL_MODULE := helloworld 6LOCAL_SRC_FILES := ../main.c 7LOCAL_CFLAGS += -fPIE 8 9include $(BUILD_SHARED_LIBRARY)
  • jni/Application.mk

Makefile

1APP_ABI := armeabi-v7a 2APP_PLATFORM := android-19
  • main.c

c

1#include <stdio.h> 2 3int say_helloworld () 4{ 5 printf("helloworld\n"); 6 return 0; 7}

実行ファイル(a.out)のソースコード

c

1// AndroidOS用はndk-buildでコンパイルした。 2// Raspberry Pi用は以下コマンドでコンパイルした。 3// gcc main.c -ldl 4#include <stdio.h> 5#include <dlfcn.h> 6 7void (*say_helloworld)(); 8 9int main() 10{ 11 void* handle = dlopen("./libhelloworld.so", RTLD_LAZY); 12 say_helloworld = (void (*)())dlsym(handle, "say_helloworld"); 13 say_helloworld(); 14 15 return 0; 16}

試したこと

  • Android OSのシェルで実行すると問題なく実行できました。

bash

1> adb shell 2$ ./main 3helloworld
  • アーキテクチャが一致しているかの確認

Android, LinuxどちらもARM32環境で一致しています。

  • straceの確認
$ strace ./a.out execve("./a.out", ["./a.out"], 0xbe816680 /* 26 vars */) = 0 brk(NULL) = 0x344000 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f55000 access("/etc/ld.so.preload", R_OK) = 0 openat(AT_FDCWD, "/etc/ld.so.preload", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=54, ...}) = 0 mmap2(NULL, 54, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0xb6f54000 close(3) = 0 readlink("/proc/self/exe", "/home/pi/a.out", 4096) = 20 openat(AT_FDCWD, "/usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\254\3\0\0004\0\0\0"..., 512) = 512 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 fstat64(3, {st_mode=S_IFREG|0644, st_size=17708, ...}) = 0 mmap2(NULL, 81964, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f12000 mprotect(0xb6f16000, 61440, PROT_NONE) = 0 mmap2(0xb6f25000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xb6f25000 close(3) = 0 munmap(0xb6f54000, 54) = 0 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=80552, ...}) = 0 mmap2(NULL, 80552, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6efe000 close(3) = 0 openat(AT_FDCWD, "/lib/arm-linux-gnueabihf/libdl.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0 \n\0\0004\0\0\0"..., 512) = 512 _llseek(3, 8688, [8688], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1080) = 1080 _llseek(3, 8340, [8340], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 8688, [8688], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1080) = 1080 _llseek(3, 8340, [8340], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 8688, [8688], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1080) = 1080 _llseek(3, 8340, [8340], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 fstat64(3, {st_mode=S_IFREG|0644, st_size=9768, ...}) = 0 mmap2(NULL, 73924, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6eeb000 mprotect(0xb6eed000, 61440, PROT_NONE) = 0 mmap2(0xb6efc000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0xb6efc000 close(3) = 0 openat(AT_FDCWD, "/lib/arm-linux-gnueabihf/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\300x\1\0004\0\0\0"..., 512) = 512 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 fstat64(3, {st_mode=S_IFREG|0755, st_size=1296004, ...}) = 0 mmap2(NULL, 1364764, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6d9d000 mprotect(0xb6ed5000, 65536, PROT_NONE) = 0 mmap2(0xb6ee5000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x138000) = 0xb6ee5000 mmap2(0xb6ee8000, 8988, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6ee8000 close(3) = 0 set_tls(0xb6f564d0) = 0 mprotect(0xb6ee5000, 8192, PROT_READ) = 0 mprotect(0xb6efc000, 4096, PROT_READ) = 0 mprotect(0xb6f25000, 4096, PROT_READ) = 0 mprotect(0x20000, 4096, PROT_READ) = 0 mprotect(0xb6f57000, 4096, PROT_READ) = 0 munmap(0xb6efe000, 80552) = 0 brk(NULL) = 0x344000 brk(0x365000) = 0x365000 openat(AT_FDCWD, "./libhelloworld.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 512) = 512 close(3) = 0 --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} --- +++ killed by SIGSEGV +++ Segmentation fault

補足情報(FW/ツールのバージョンなど)

  • OnePlus One(ARM32)(Android 9)

CPU: Snapdragon 801(MSM8974PRO-AC)

  • Raspberry Pi 4 Model B Rev 1.2 (ARM32)(Raspbian 32bit GNU/Linux 10 (buster))

CPU: BCM2711(Cortex-A72)

cmd

1$ ndk-build -version 2GNU Make 4.2.1 3Built for x86_64-w64-mingw32 4Copyright (C) 1988-2016 Free Software Foundation, Inc. 5License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 6This is free software: you are free to change and redistribute it. 7There is NO WARRANTY, to the extent permitted by law.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問