0
ich mit einigen Asset-Dateien meiner App in native C++ Code möchten, so habe ich einige Code-Tests wie folgt:fehlgeschlagen Assetmanager von Java zu c passieren ++ durch JNI
Java
package com.example.andy.textureviewtest;
import ...
public class MainActivity extends AppCompatActivity {
private AssetManager assetManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
assetManager = getAssets();
generateAssets(assetManager);
}
public native String stringFromJNI();
public native int generateAssets(AssetManager assetManager);
static {
System.loadLibrary("native-lib");
}
}
C++
#include <jni.h>
#include <string>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
#include <android/log.h>
JNIEXPORT jstring JNICALL Java_com_example_andy_textureviewtest_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
JNIEXPORT jint JNICALL Java_com_example_andy_textureviewtest_MainActivity_generateAssets(
JNIEnv* env,jobject thiz,jobject assetManager) {
AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
AAssetDir* assetDir = AAssetManager_openDir(mgr, "");
const char* filename = (const char*)NULL;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) {
AAsset* asset = AAssetManager_open(mgr, filename, AASSET_MODE_UNKNOWN);
off_t bufferSize = AAsset_getLength(asset);
}
return 0;
}
aber wenn meine app läuft, ich habe nur diesen Fehler:
java.lang.UnsatisfiedLinkError: No implementation found for int com.example.andy.textureviewtest.MainActivity.generateAssets(android.content.res.AssetManager) (tried Java_com_example_andy_textureviewtest_MainActivity_generateAssets and Java_com_example_andy_textureviewtest_MainActivity_generateAssets__Landroid_content_res_AssetManager_2)
Irgendwas falsch hier, das ich verpasst haben könnte?
Deshalb gibt es einen 'javah' Befehl, um richtige Header-Dateien zu erzeugen. –
@AndrewHenle: einschließlich Header-Dateien ist nicht notwendig für JNI, aber es macht definitiv das Leben leichter. –
extern "C" hinzufügen, bevor zwei native Funktionen immer noch den gleichen Fehler bekommen @ AlexCohn –