前提・実現したいこと
ビルド済みライブラリの使用に書いてる「ソースを配布せずに、独自のライブラリをサードパーティの NDK デベロッパーに配布する。」を行いたいのですが、やり方がわかりません。
JNIや中の関数だけをライブラリにする方法はありませんでしょうか?
発生している問題・エラーメッセージ
JNIでC++のソースコード・共有オブジェクトをAndroidから利用するチュートリアルをやってみたの様に、
JNIで作成したnativeライブラリ(soファイルもしくはaarモジュール)を別のプロジェクトで再利用したいのですが、JNICALL
以下の名前でプロジェクト名を使用する為、結局ソースが必要になってしまいます。
AndroidStudio 他のプロジェクトのモジュール内のC++を参照しよう(Java / kotlin)でもcppの中身が見えてしまいます。
該当のソースコード
Java
1public class MainActivity extends AppCompatActivity { 2 static { 3 System.loadLibrary("native-lib"); 4 } 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 TextView tv = findViewById(R.id.sample_text); 12 13 int[] intArray = new int[10]; 14 for(int i=0;i<intArray.length;i++) 15 intArray[i] = i+1; 16 17 final int[] intAns = intFromJNI(intArray); 18 19 tv.setText("Size:" + intAns.length + " " + intAns[1] + " " + intAns[2]); // 個数と2個目と3個目を表示 20 } 21 22 public native int[] intFromJNI(int[] intArr); 23}
配布したいJNI部分
C++
1#include <jni.h> 2#include <string> 3#include <vector> 4 5extern "C" JNIEXPORT jintArray JNICALL 6Java_s_test_cppmodule_MainActivity_intFromJNI( 7 JNIEnv *env, 8 jobject 9 , jintArray intInput) { 10 const jint intInputSize = env->GetArrayLength(intInput); 11 jint *intArr = env->GetIntArrayElements(intInput, 0); 12 13 // 処理内容だけでもいい 14 int intOutSize = intInputSize / 2; 15 int intValues[intOutSize]; 16 for(int i=0;i<intOutSize;i++) 17 intValues[i] = intArr[i*2] * 10; 18 19 env->ReleaseIntArrayElements(intInput, intArr, false); // 開放 20 21 jintArray intOutArray = env->NewIntArray(intOutSize); 22 env->SetIntArrayRegion(intOutArray, 0, intOutSize, intValues); 23 return intOutArray; 24}
試したこと
1.Android Studioで *.jar, *.soを追加するを参考にsoファイルが入っている
\app\build\intermediates\stripped_native_libs\debug\out\lib
フォルダを別プロジェクトの\src\mainの下へコピーし、jniLibs
として置いてみましたが、使えませんでした。
2.AndroidStudio モジュール内のC++を参照するを参考にモジュールのAARを作成し、別プロジェクトで[File]->[New]->[New Module]->[Import .JAR/.AAR Package]で作成したAARを読み込んでみましたが、モジュール名が見えるだけでヘッダファイルが参照出来ず、中の関数は使用出来ませんでした。
3.[File]->[New]->[New Module]->[Android Library]でモジュールを作成し、
モジュールフォルダにcppフォルダをコピーしてみましたが、Synchronizeしても表示されませんでした。
補足情報(FW/ツールのバージョンなど)
Windows 10
AndroidStudio 3.5.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/04 05:59
2020/03/04 06:06